如何在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表示算术),那么您将确切知道什么需要包装,其余的可以保持未包装状态


在这两种情况下,这可能比在表中包装更快/更可读。

不幸的是,我没有在我的环境中访问调试表的权限。然而,我仍然认为你的答案是正确的,因为它完美地回答了这个问题。