是否存在类似于红宝石的lua中的别名

时间:2014-06-15 07:40:24

标签: lua

你能否以类似于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脚本的程序开发,我需要覆盖在默认文件中声明的函数。

2 个答案:

答案 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