Lua中是否有类似Ruby的别名?

你能否以与 Ruby 类似的方式,在 LUA 中为一个函数(非类)创建别名?在 Ruby 中你会这样做:

alias new_name_for_method method()
def method()
  new_name_for_method() # 调用原始方法,然后进行自定义代码
  i = 12 # 新代码
end

我询问是因为我正在为一个使用 LUA 脚本的程序进行开发,我需要覆盖在默认文件中声明的一个函数。

点赞
用户501459
用户501459

在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

FYI,当包装函数时,如果您希望其旧行为受到保护,即使其签名更改,现在和将来都不会受到影响,您需要将所有参数和返回值转发。

对于前置钩子(在旧钩子之前调用的新代码),这很简单:

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
2014-06-15 08:06:56
用户1955931
用户1955931

在 Lua 中,你可以简单地通过创建一个同名的新函数或变量来覆盖一个变量。

function name_to_override()
    print('hi')
end

如果你仍然想调用旧函数:

local old_function = name_to_override

function name_to_override()
    old_function()
    print('hi')
end
2014-06-15 08:07:33