Lua是否有类似于Swift或C#中的variable?.function()的功能? 大家好!

Lua是否有类似于Swift或C#中的variable?.function()的功能? 大家好!,lua,Lua,我最近在用Lua编程,已经厌倦了写一些类似这样的代码 if variable ~= nil then variable.function() end 我知道在C#或Swift中,我们可以做类似的事情 variable?.function() Lua是否有一些方法来实现这种功能?摘自第四版“Lua编程”中的“表”一节: Lua不提供安全的导航操作员,我们认为它也不应该提供。Lua是极简主义者。此外,这个操作符是相当有争议的,许多人争论——不是没有原因的——它促进了粗心的编程。然而,我

我最近在用Lua编程,已经厌倦了写一些类似这样的代码

if variable ~= nil then
    variable.function()
end

我知道在C#或Swift中,我们可以做类似的事情

variable?.function()
Lua是否有一些方法来实现这种功能?

摘自第四版“Lua编程”中的“表”一节:

Lua不提供安全的导航操作员,我们认为它也不应该提供。Lua是极简主义者。此外,这个操作符是相当有争议的,许多人争论——不是没有原因的——它促进了粗心的编程。然而,我们可以在Lua中用一些额外的符号来模拟它

建议的额外符号可能适用于您的情况

((variable or {}).func or function() end)()
这将检查
变量
是否为
nil
(或
false
),如果不是,则尝试访问其条目
func
(请注意,不能命名函数
函数
,因为这是一个关键字)-如果不存在,则返回一个不执行任何操作的函数,否则,它将返回函数
variable.func
。结果函数立即被调用


不过,我认为这不是很可读。

编写一个简单的实用程序函数很容易:

function call_if(func, ...)
  if(func) then
    return func(...)
  end
  return
end

哇,它确实通过Lua的语法来解决这个问题。但是,是的,它变成了从三行代码到一行更复杂的形式。不管怎样,我明白了。非常感谢您的回答!您可以将
nil
设为可索引和可调用:
debug.setmetatable(nil,{uuuuu index={},{uuu call=function()end})
之后,您可以在不进行任何检查的情况下执行
var.func()然后,您应该重新评估您的编程风格,您经常会问一个变量是否为
nil