作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在元表中重载 __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/
每年一次或两次,我遇到以下问题:我遇到了某种类型的比较操作,该操作可能比较昂贵(例如,值太大以保存在内存中,并且需要从磁盘加载,或者很难计算相等性,因为单个值可能有很多表示形式,请考虑化学式)。此类型
在元表中重载 __eq、__lt 和 __le 总是将返回值转换为 bool 值。 有没有办法访问实际的返回值? 这将在下面的小 lua 脚本中用于为参数创建表达式树 用法: print(_.a +
我是一名优秀的程序员,十分优秀!