2012-06-08 29 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会持守你的承诺。