如何在Lua基本类型之间启用算术?
流行的脚本语言允许这样的表达式如何在Lua基本类型之间启用算术?,lua,Lua,流行的脚本语言允许这样的表达式 true*5>10.3*false 如果true为1,false为0,则除0之外的任何数字也为true 你能在lua做同样的事吗 当前,im将所有操作数包装到一个表中,并使用诸如uu sub之类的元方法来启用上述功能,但它会生成详细代码和开销是。请参阅下面的代码。您可以为其他算术运算添加类似的元方法 local function b2n(x) if x==false then return 0 end if x==true then re
true*5>10.3*false
如果true为1,false为0,则除0之外的任何数字也为true
你能在lua做同样的事吗
当前,im将所有操作数包装到一个表中,并使用诸如uu sub之类的元方法来启用上述功能,但它会生成详细代码和开销是。请参阅下面的代码。您可以为其他算术运算添加类似的元方法
local function b2n(x)
if x==false then return 0 end
if x==true then return 1 end
return x
end
debug.setmetatable(false,{
__mul=function(x,y) return b2n(x)*b2n(y) end
})
print(true*5 > 10.3*false)
考虑到这一点,一种虽然不如lhf所描述的“正确方式”的方法可能会对您有所帮助 目前,我正在将所有操作数包装到一个表中,并使用诸如
\uuu sub
之类的元方法来启用上述功能,但它会生成冗长的代码和开销
及
我无权访问环境中的调试表
具有强制值的函数,如N
,B
function N( x )
local ty = type( x )
if ty == "number" then return x end
if ty == "boolean" then return x and 1 or 0 end
-- and so on for other types you need to handle
end
然后你会说B(v)和(N(x)*N(y)>N(z)+N(w))
或类似的话。虽然仍然有很多函数调用,但它可能比在表中包装所有内容更快,而且(取决于包装的方式/位置),这也可能更具可读性
如果您正在编写类库代码,则在顶层执行强制(在公开的库函数中,在接收值之后/在通常进行类型检查的地方)意味着您的库中始终具有正确类型的值,而不需要这些强制函数。因此,它本质上只是在入口点进行类型检查/自动强制,然后是正常代码
如果您在代码中使用它是为了方便(比如,将比较结果解释为0或1表示算术),那么您将确切知道什么需要包装,其余的可以保持未包装状态
在这两种情况下,这可能比在表中包装更快/更可读。不幸的是,我没有在我的环境中访问调试表的权限。然而,我仍然认为你的答案是正确的,因为它完美地回答了这个问题。