Lua元表 __ lt __ le __ eq 强制返回值的布尔转换

在元表中重载__eq__lt__le总是会将返回值转换为布尔值。

是否有一种方法可以访问实际的返回值?

在下面的小lua脚本中使用,来创建一个参数的表达式树

用法:

print(_.a + _.b - _.c * _.d + _.a)
         -> 输出 "(((a+b)-(c*d))+a)",这正是我想要的

但当 print(_.a == _.b) 时,它不起作用,因为返回值被转换为布尔值。

备注:print应该被替换为稍后处理表达式树的函数

-- 来自lua脚本的片段 -

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虚拟机是一个选择,但是如果我能使用官方发布版本会更好

点赞
用户734069
用户734069

不需要修改 Lua 本身是无法做到的。这些并不是为了让运算符像 C++ 运算符重载一样做任意操作的方式;它们旨在做到完全和它们所说的一样

而 Lua 会让你信守这个承诺。

2012-06-08 16:36:46