lua元表\uuuu lt\uuuu le\uuuuuu eq强制布尔转换返回值
元表中的重载lua元表\uuuu lt\uuuu le\uuuuuu eq强制布尔转换返回值,lua,operator-overloading,metatable,Lua,Operator Overloading,Metatable,元表中的重载\uuuu eq、\uu lt和\uu le总是将返回值转换为布尔值 有没有办法访问实际返回值 这将在下面的小lua脚本中用于为参数创建表达式树 用法: print(_.a + _.b - _.c * _.d + _.a) -> prints "(((a+b)-(c*d))+a)" which is perfectly what I would like to have 但是它不适用于print(u.a==u.b),因为返回值被转换为布尔值 ps:prin
\uuuu eq
、\uu lt
和\uu le
总是将返回值转换为布尔值
有没有办法访问实际返回值
这将在下面的小lua脚本中用于为参数创建表达式树
用法:
print(_.a + _.b - _.c * _.d + _.a)
-> prints "(((a+b)-(c*d))+a)" which is perfectly what I would like to have
但是它不适用于print(u.a==u.b)
,因为返回值被转换为布尔值
ps:print稍后应替换为处理表达式树的函数
--从lua脚本中剪下--
函数binop(op1、op2、事件)
如果是op1[event],则返回op1[event](op1,op2)end
如果是op2[event],则返回op2[event](op1,op2)end
归零
结束
函数eq(op1,op2)返回binop(op1,op2,“eq”)结束
...
函数div(op1,op2)返回binop(op1,op2,“div”)结束
函数exprObj(tostr)
ExpR= {eq= BiNeXPR(“==”),Lt= BiNeXPR(“不不需要黑客Lua本身”。这些不旨在使操作员做任意的东西,如C++运算符重载;它们的意图是按照他们所说的去做。
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 })