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
这使我们可以轻松地覆盖方法,例如添加自定义日志记录。想象一个Foo
有方法的类do_something
,我们想要重写它。我们可以做的:
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 来做alias_method
:
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"
有关更多信息,您可以参考文档。