gpt4 book ai didi

lua metatable __lt __le __eq 返回值的强制 bool 转换

转载 作者:行者123 更新时间:2023-12-04 00:45:29 25 4
gpt4 key购买 nike

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

有没有办法访问实际的返回值?

这将在下面的小 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) 因为返回值被转换为 bool 值

ps: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 vm 是一个选项,但是如果我可以使用官方版本就更好了

最佳答案

不是没有破解 Lua 本身。这些并不是让运算符做任意事情的方法,比如 C++ 运算符重载;他们打算完全按照他们所说的去做

而且 Lua 会让你信守 promise 。

关于lua metatable __lt __le __eq 返回值的强制 bool 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10951942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com