gpt4 book ai didi

ruby-on-rails - 覆盖 ruby​​ 类中的 module_function 以访问原始文件

转载 作者:太空宇宙 更新时间:2023-11-03 17:42:49 24 4
gpt4 key购买 nike

我正在尝试覆盖这样定义的 Rails 辅助方法:

class Foo
module Bar

def orig
# orig code
end

alias o orig

module_function :o
module_function :orig

end
end

这样我就可以覆盖并向 origo 添加功能,如下所示:

def orig
# new code
# super (run orig code)
end
alias o orig

我已经查看了 several different monkey patching methods但它们似乎不起作用。我相信 module_function 是导致它失败的原因。

有人知道我怎样才能做到这一点吗?

最佳答案

这里有一个解决方法。您可以重新打开模块,对原始实例方法进行未绑定(bind)引用,然后重新定义它以调用原始方法(具有一些改变的行为)。

首先是原始定义:

module Foo
def bar(arg)
"self=#{self}, arg=#{arg}"
end
module_function :bar
end

接下来,重新打开并重新定义方法:

module Foo
OrigBarMethod = instance_method(:bar)
def bar(arg)
Foo::OrigBarMethod.bind(self).call(arg + 1)
end
module_function :bar
end

puts Foo.bar(1) # => "self=Foo, arg=2"

我使用了bind(self),这样原来的方法仍然可以使用self,例如:

class MyClass
include Foo
end

MyClass.new.send(:bar, 1) # => "self=#<MyClass:0x00007fb66a86cbf8>, arg=2"

关于ruby-on-rails - 覆盖 ruby​​ 类中的 module_function 以访问原始文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53235417/

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