print("i", "j", "i & j")
for i = 0,1 do
for j=0,1 do
print(i, j, i & j)
end
end
上面的代碼在 Lua 中運行良好。它給出以下輸出。
i j i & j
0 0 0
0 1 0
1 0 0
1 1 1
我想定義另一個 operator implies。它是條件邏輯運算子。只有當 p 為真且 q 為假時,結果p implies q才為假。
print("i", "j", "i implies j")
for i = 0,1 do
for j=0,1 do
print(i, j, i implies j)
end
end
我希望上面的代碼作業。它應該輸出以下內容。
i j i implies j
0 0 1
0 1 1
1 0 0
1 1 1
到目前為止,我已經成功地定義了隱含函式,但這似乎并沒有多大用處。當然我可以寫蘊含(i,j),但我想要類似于 & 或 | 的運算子 我可以使用。所以基本問題是復制邏輯運算子 & 或 | 的定義 來自lua。這是暗示函式(不是運算子)的代碼。
function implies(a,b)
if a then
return b
else
return True
end
end
uj5u.com熱心網友回復:
OOP 風格的呼叫
如果它必須真的是中綴的話,這會變得相當老套。簡單地將元表用于 OOP-ishobject:method(params)語法怎么樣?
假設implies定義為
local function _implies(a, b)
if a ~= 0 then return b end
return 1
end
這將被實施為
debug.setmetatable(0, {__index = {
implies = _implies
}})
并用作
i:implies(j)
如果您希望使用更簡單的點語法,請考慮使用柯里化:
debug.setmetatable(0, {__index = {
implies = function(a) return function(b) return _implies(a, b) end end
}})
用作
i.implies(j)
可以通過使用元__call方法并傳遞函式名稱來實作更“中綴式”的表示法:
debug.setmetatable(0, {__index = {
implies = function(a) return function(b) return _implies(a, b) end end
}, __call = function(self, index) return self[index] end})
(i)("implies")(j)
如果implies = "implies",這甚至可以縮短為(i)(implies)(j)。
Hacky,“真正”的中綴符號
如果中綴表示法是最重要的,但你不能使用可用的元方法,因為它們是有限的而且相當不可讀,你可以使用更多的柯里化和變通方法來使用其他元方法來創建看似改變你的功能的運算子(至少在語法上)使用“代理”元表而不是函式進入中綴運算子。您可以使用任何您喜歡的運算子;只需確保它們在關聯性和優先級方面滿足您的需求:
local implies_right_hand_mt = {
__mul = function(self, b)
return _implies(self.a, b)
end
}
local implies_left_hand = setmetatable({}, {
__mul = function(a)
return setmetatable({a = a}, implies_right_hand_mt)
end
})
implies = implies_left_hand
然后,語法將是i *implies* j或"i *implies* j"在您的示例中(使用乘法運算子)。但是,您也可以使用所有其他運算子(比較運算子除外),包括其他算術運算子,因為implies不是數字而是表格,因此可能會覆寫數字元方法。
邊注
考慮使用布林值而不是數字。你會得到兩個好處:
- 大多數元方法不被布林值使用(尤其是所有算術和按位元方法);
- 邏輯運算子
not,and和or作業;您不必使用按位運算子(盡管它們也可以正常作業)。
uj5u.com熱心網友回復:
“數字”資料型別有兩種可用的元方法:__call和__index.
debug.setmetatable(0, {__call = function(a, b) return a~1|b end})
-- Now you can use "(i)(j)" for "i implies j"
print("i", "j", "(i)(j)")
for i = 0,1 do
for j = 0,1 do
print(i, j, (i)(j))
end
end
uj5u.com熱心網友回復:
Lua 沒有提供用戶定義的運算子。
自定義運算子
但是如果 i 和 j 是布林值,你可以使用:
i and j or true
它不適用于 0 和 1,因為對于 LUA,它們都是真的!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/440287.html
下一篇:ifelse函式基于多個條件
