我有一个我希望在程序运行时动态添加的功能。
让我们说我有Foo功能:
function foo()
Function1()
Function2()
Function3()
end
我希望将Foo()更改为:
function foo()
Function1()
Function2()
Function3()
Function4()
end
稍后在该计划中。有没有办法做到这一点?
答案 0 :(得分:7)
做吧。你写的代码工作得很好。 Lua中的函数可以根据需要重新定义。
如果你不知道foo
做了什么,你可以这样做:
do
local old = foo
foo = function () old() Function4() end
end
或者使用功能表可能更清楚:
local F={ Function1, Function2, Function3 }
function foo()
for i=1,#F do F[i]() end
end
后来,做
F[#F+1]=Function4
并且您不需要重新定义foo
。
答案 1 :(得分:0)
这是背景资料的补充答案。
Lua标识符用于全局变量,局部变量,参数和表字段。他们拥有任何类型的价值。
Lua函数是值。无论用于定义它们的语法如何,Lua函数都是匿名的。
function f()
--...
end
是一个Lua语句,它编译为函数定义和变量赋值。
是替代f = function()
--...
end
每次执行函数定义时,它都会生成一个新的函数值,然后在任何关联的表达式或赋值中使用它。
应该清楚的是,两个语句都不一定要创建一个新变量,也不要求它始终具有相同的值,也不要求它始终保持一个函数值。此外,创建的函数值不必总是仅由一个变量保持。 它可以像任何其他值一样被复制。
此外,就像其他值一样,函数值是垃圾回收的。因此,如果f
具有函数值并且被赋予不同的值或超出范围(例如,如果它不是全局变量),则在没有其他任何内容引用时,前一个值将被垃圾收集。
在function f() end
没有任何其他上下文的情况下,我们假设f
是一个全局变量。但事实并非如此。如果f
是范围内的本地或参数,那就是将被分配到的f
。