22

如果这两种方法只是同义词,为什么人们还要麻烦写附加字符“ _chain”?

4

2 回答 2

57

No. alias_method是 Ruby 的标准方法。 alias_method_chain是一个 Rails 附加组件,旨在简化将旧方法别名为新名称,然后将新方法别名为原始名称的常见操作。因此,例如,如果您正在method使用新功能创建方法的新版本new_feature,则以下两个代码示例是等效的:

alias_method :method_without_new_feature, :method
alias_method :method, :method_with_new_feature

alias_method_chain :method, :new_feature

编辑

这是一个假设的例子:假设我们有一个带有方法的 Person 类rename。它所做的只是采用像“John Doe”这样的字符串,在空间上拆分,并将部分分配给 first_name 和 last_name。例如:

person.rename("Steve Jones")
person.first_name  #=> Steve
person.last_name   #=> Jones

现在我们遇到了问题。我们不断收到大写不正确的新名称。所以我们可以写一个新的方法rename_with_capitalizationalias_method_chain解决这个问题:

class Person
  def rename_with_capitalization(name)
    rename_without_capitalization(name)
    self.first_name[0,1] = self.first_name[0,1].upcase
    self.last_name[0,1] = self.last_name[0,1].upcase
  end

  alias_method_chain :rename, :capitalization
end

现在,旧rename的被称为rename_without_capitalization,并且rename_with_capitalizationrename。例如:

person.rename("bob smith")
person.first_name  #=> Bob
person.last_name   #=> Smith

person.rename_without_capitalization("tom johnson")
person.first_name  #=> tom
person.last_name   #=> johnson
于 2009-06-23T19:32:00.540 回答
5

alias_method_chain是进行方法调用拦截的最坏方法。如果您正在寻找类似的技术,请不要在铁轨外使用它。

于 2009-06-24T03:33:22.237 回答