我正在开发我的web应用程序,我想重写一个方法,例如,如果原始类是
class A
def foo
'original'
end
end
我想重写foo方法,可以这样做
class A
alias_method :old_foo, :foo
def foo
old_foo + ' and another foo'
end
end
我可以像这样调用新旧方法
obj = A.new
obj.foo #=> 'original and another foo'
obj.old_foo #=> 'original'
那么,如果我可以像以前那样访问和保留这两个方法,那么alias_method_chain有什么用呢?
最佳答案
alias_method_chain
的行为与alias_method
不同
如果您有方法do_something
并且希望重写它,保留旧方法,则可以执行以下操作:
alias_method_chain :do_something, :something_else
相当于:
alias_method :do_something_without_something_else, :do_something
alias_method :do_something, :do_something_with_something_else
这允许我们轻松地重写方法,例如添加自定义日志记录。想象一个带有方法的类,我们想要覆盖它。我们可以做到:
class Foo
def do_something_with_logging(*args, &block)
result = do_something_without_logging(*args, &block)
custom_log(result)
result
end
alias_method_chain :do_something, :logging
end
为了完成你的工作,你可以:
class A
def foo_with_another
'another foo'
end
alias_method_chain :foo, :another
end
a = A.new
a.foo # => "another foo"
a.foo_without_another # => "original"
因为它不是很复杂,所以您也可以使用plain
Foo
:class A
def new_foo
'another foo'
end
alias_method :old_foo, :foo
alias_method :foo, :new_foo
end
a = A.new
a.foo # => "another foo"
a.old_foo # => "original"
有关更多信息,请参阅documentation。
关于ruby-on-rails - alias_method和alias_method_chain有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23628670/