你能否以类似于Ruby的方式在LUA中为一个函数(不在类中)进行别名?在红宝石中你会做这样的事情:
alias new_name_for_method method()
def method()
new_name_for_method() # Call original method then do custom code
i = 12 # New code
end
我问,因为我正在为使用LUA脚本的程序开发,我需要覆盖在默认文件中声明的函数。
答案 0 :(得分:6)
在Lua中,函数是值,被视为任何其他值(数字,字符串,表格等)。您可以通过任意数量的变量引用函数值。
在你的情况下:
local oldmethod = method
function method(...)
oldmethod(...)
i = 12 -- new code
end
请记住
function method() end
是:
的简写method = function() end
function() end
只创建一个函数值,我们将其赋值给变量method
。我们可以转而在十几个其他变量中存储相同的值,或者为method
变量分配一个字符串或数字。在Lua中,变量没有类型,只有值。
更多插图:
print("Hello, World")
donut = print
donut("Hello, World")
t = { foo = { bar = donut } }
t.foo.bar("Hello, World")
assert(t.foo.bar == print) -- same value
仅供参考,在包装函数时,如果您希望其旧行为暂时不受影响,即使其签名发生更改,您也需要转发所有参数并返回值。
对于预钩子(在旧的之前调用的新代码),这是微不足道的:
local oldmethod = method
function method(...)
i = 12 -- new code
return oldmethod(...)
end
后挂钩(旧的后调用的新代码)有点贵; Lua支持多个返回值,我们必须将它们全部存储起来,这需要创建一个表:
local oldmethod = method
function method(...)
local return_values = { oldmethod(...) }
i = 12 -- new code
return unpack(return_values)
end
答案 1 :(得分:1)
在lua中,您可以通过创建具有相同名称的新函数或变量来简单地覆盖变量。
function name_to_override()
print('hi')
end
如果您仍希望能够调用旧功能:
local old_function = name_to_override
function name_to_override()
old_function()
print('hi')
end