Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
lua元表\uuuu lt\uuuu le\uuuuuu eq强制布尔转换返回值_Lua_Operator Overloading_Metatable - Fatal编程技术网

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 })