7

我正在开发我的网络应用程序,我想覆盖一个方法,例如,如果原始类是

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 有什么用呢?

4

1 回答 1

9

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"

有关更多信息,您可以参考文档

于 2014-05-13T10:28:38.263 回答