Lua中的函数重载?

Posted

技术标签:

【中文标题】Lua中的函数重载?【英文标题】:Function overloading in Lua? 【发布时间】:2017-04-04 16:14:14 【问题描述】:

我在 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;

我该怎么做?

【问题讨论】:

问题标题具有误导性。函数重载是让调用者根据参数的数量(和/或)类型选择具有相同名称的多个函数的选项。一个相关的概念是默认参数,这两个概念的功能是相当的。您似乎要求的是遮蔽、替换(或覆盖)功能。 【参考方案1】:
local printFunc = (fibaro or ).debug and function(...) return fibaro:debug(...) end or print

【讨论】:

如果你能详细说明一下就好了:) @filmor 代码很容易解释。它只是使用布尔逻辑来避免必须通过 if 语句。使它成为一个漂亮而干净的单线。 对我来说,单行并不是nice,因为它会导致浏览器中出现水平滚动条。【参考方案2】:

冒号运算符只能在方法调用中使用,所以这是一个语法错误:

local printFunc = fibaro:debug or print

这可以用点运算符来写

local printFunc = fibaro.debug or print

但如果 fibaro.debug 存在,那么您需要明确地为 printFunc 提供 fibaro 对象,fibaro.debug 期望作为其第一个(隐藏)参数。

【讨论】:

好的,这实际上更好。会试试的。【参考方案3】:
local printFunc = print
if (fibaro or ).debug then 
   function printFunc(...) 
      return fibaro:debug(...)
   end
end

【讨论】:

效果很好!谢谢!

以上是关于Lua中的函数重载?的主要内容,如果未能解决你的问题,请参考以下文章

C++中赋值运算操作符和=重载有啥区别?

类中的函数重载

类中的函数重载(二十三)

C++深度剖析学习总结 22 类中的函数重载

C++深度剖析学习总结 22 类中的函数重载

29 类中的函数重载