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中的函数重载?的主要内容,如果未能解决你的问题,请参考以下文章