2012-06-08 30 views
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虛擬機是一個選項,但是這將是很好,如果我可以用一個正式發佈

+0

你可能會對[MetaLua](http://metalua.luaforge.net/index.html)感興趣,它允許添加新的操作符。 – jpjacobs

回答

5

並非沒有黑客的Lua本身。這些並不是爲了讓操作員執行像C++操作符重載這樣的任意操作。他們打算做正是他們所說的

而且Lua會持守你的承諾。