alias_method_chain是alias_method的同义词吗?

时间:2009-06-23 19:19:10

标签: ruby-on-rails ruby alias

如果这两种方法只是同义词,为什么人们会去编写附加字符“_chain”呢?

2 个答案:

答案 0 :(得分:56)

没有。 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

修改

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

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

现在我们遇到了问题。我们不断获得没有正确大写的新名称。因此,我们可以编写一个新方法rename_with_capitalization并使用alias_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_capitalizationrename_with_capitalization被称为rename。例如:

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

答案 1 :(得分:5)

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