Lua中的函数重载?

3

我正在使用Fibaro智能家居系统编写脚本(“场景”),需要了解如何在Lua中实现一些好的功能。Fibaro有自己的调试函数,但为了简单测试Lua函数,最好不要总是在Fibaro Lua场景界面中工作。

有一个名为fibaro:debug的函数,它处理界面中信息的简单打印,基本上就像控制台上的print。因此,在我的函数中,我想为当前可用的这两个函数之一指定一个别名。

我尝试像默认值一样处理它:

local printFunc = fibaro:debug or print;

以下代码无法正常工作。添加明确的IF/ELSE块也不能解决问题:

if(fibaro:debug == nil) then printFun = fibaro:debug;else  printFun =print;end;

我该如何做这件事?


题目标题有误导性。函数重载是一种选择,可以有多个具有相同名称的函数,由调用者通过参数的数量(和/或)类型来选择。相关概念是默认参数,两个概念的功能是可比较的。你似乎要求的是函数的阴影效果,替换(或可能覆盖)函数。 - Wolf
3个回答

3
冒号运算符只能在方法调用中使用,因此这是语法错误:
local printFunc = fibaro:debug or print

这可以使用点运算符来编写

local printFunc = fibaro.debug or print

但是如果存在fibaro.debug,那么您需要显式地提供一个带有fibaro对象的printFunc,以便fibaro.debug将其作为第一个(隐藏)参数。


好的,这实际上更好。我会试一下。 - Fredrik Karlsson

2
local printFunc = print
if (fibaro or {}).debug then 
   function printFunc(...) 
      return fibaro:debug(...)
   end
end

运行得很好!谢谢! - Fredrik Karlsson

0
local printFunc = (fibaro or {}).debug and function(...) return fibaro:debug(...) end or print

6
如果您能再详细解释一下就更好了 :) - filmor
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - warspyking
对我来说,当一行代码在浏览器中导致水平滚动条时,它并不好看 - Wolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接