2
在metatable中重載__eq
,__lt
和__le
總是將返回值轉換爲布爾值。lua metatable __lt __le __eq返回值的強制布爾轉換
有沒有辦法訪問實際返回值?
這將在下面的小LUA腳本用於爲參數
使用創建表達式樹:
print(_.a + _.b - _.c * _.d + _.a)
-> prints "(((a+b)-(c*d))+a)" which is perfectly what I would like to have
,但它並不適用於print(_.a == _.b)
工作,因爲返回值被轉換爲一個布爾
PS:打印應後用函數處理所述表達式樹
取代 - SN從Lua腳本IP -
function binop(op1,op2, event)
if op1[event] then return op1[event](op1, op2) end
if op2[event] then return op2[event](op1, op2) end
return nil
end
function eq(op1, op2)return binop(op1,op2, "eq") end
...
function div(op1, op2)return binop(op1,op2, "div") end
function exprObj(tostr)
expr = { eq = binExpr("=="), lt = binExpr("<"), le = binExpr("<="), add = binExpr("+"), sub=binExpr("-"), mul = binExpr("*"), div= binExpr("/") }
setmetatable(expr, { __eq = eq, __lt = lt, __le = le, __add = add, __sub = sub, __mul = mul, __div = div, __tostring = tostr })
return expr
end
function binExpr(exprType)
function binExprBind(lhs, rhs)
return exprObj(function(op) return "(" .. tostring(lhs) .. exprType .. tostring(rhs) .. ")" end)
end
return binExprBind
end
function varExpr(obj, name)
return exprObj(function() return name end)
end
_ = {}
setmetatable(_, { __index = varExpr })
- 卡 -
對矯正的LUA虛擬機是一個選項,但是這將是很好,如果我可以用一個正式發佈
你可能會對[MetaLua](http://metalua.luaforge.net/index.html)感興趣,它允許添加新的操作符。 – jpjacobs