gpt4 book ai didi

lua - lua中是否有类似于ruby的别名

转载 作者:行者123 更新时间:2023-12-05 00:09:19 25 4
gpt4 key购买 nike

您能否在 LUA 中为函数(不在类中)以与 Ruby 类似的方式别名?在 ruby​​ 中,你会做这样的事情:

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 脚本的程序进行开发,并且我需要覆盖在默认文件中声明的函数。

最佳答案

在 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

仅供引用,在包装函数时,如果您希望它的旧行为现在和永远不受影响,即使它的签名发生变化,您也需要转发所有参数并返回值。

对于 pre-hook(新代码在旧代码之前调用),这是微不足道的:

local oldmethod = method
function method(...)
i = 12 -- new code
return oldmethod(...)
end

后 Hook (在旧代码之后调用新代码)有点贵; Lua 支持多个返回值,我们必须将它们全部存储起来,这需要创建一个表:

local oldmethod = method
function method(...)
local return_values = { oldmethod(...) }
i = 12 -- new code
return unpack(return_values)
end

关于lua - lua中是否有类似于ruby的别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24227557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com