【问题标题】:is there aliasing in lua similar to rubylua中是否有类似于ruby的别名
【发布时间】:2014-06-16 03:08:59
【问题描述】:

您能否在 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


    【解决方案1】:

    在 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
    

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

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

    【讨论】:

    • 这个答案更完整,信息也更多,但两者都做得很好。谢谢。
    • pre hook 的一个很好的例子是修改参数:function method(i,...) i=i*2 return oldmethod(i,...) end
    【解决方案2】:

    在 lua 中,您可以通过创建具有相同名称的新函数或变量来简单地覆盖变量。

    function name_to_override()
        print('hi')
    end
    

    如果您仍然希望能够调用旧函数:

    local old_function = name_to_override
    
    function name_to_override()
        old_function()
        print('hi')
    end
    

    【讨论】:

    • 这个答案是正确的,但另一个答案有更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2016-03-29
    相关资源
    最近更新 更多