Ruby on rails alias\u方法\u链是否与alias\u方法同义?
如果这两种方法只是同义词,为什么人们要费劲地编写附加字符“Ruby on rails alias\u方法\u链是否与alias\u方法同义?,ruby-on-rails,ruby,alias,Ruby On Rails,Ruby,Alias,如果这两种方法只是同义词,为什么人们要费劲地编写附加字符“\u chain”?No.alias\u方法是Ruby的标准方法alias\u method\u chain是一个Rails附加组件,旨在简化将旧方法别名为新名称,然后将新方法别名为原始名称的常见操作。因此,例如,如果您正在使用新功能创建新版本的方法方法,则以下两个代码示例是等效的: alias_method :method_without_new_feature, :method alias_method :method, :metho
\u chain
”?No.alias\u方法是Ruby的标准方法alias\u method\u chain
是一个Rails附加组件,旨在简化将旧方法别名为新名称,然后将新方法别名为原始名称的常见操作。因此,例如,如果您正在使用新功能创建新版本的方法
方法,则以下两个代码示例是等效的:
alias_method :method_without_new_feature, :method
alias_method :method, :method_with_new_feature
及
编辑
这里是一个假设的例子:假设我们有一个Person类,它的方法是rename
。它所做的只是取一个类似“John Doe”的字符串,在空格上拆分,并将部分分配给first_name和last_name。例如:
person.rename("Steve Jones")
person.first_name #=> Steve
person.last_name #=> Jones
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
现在我们遇到了一个问题。我们不断得到大写不正确的新名字。因此,我们可以编写一个新方法使用大写字母重命名\u
,并使用别名\u方法\u链
来解决此问题:
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\u(不带大写字母)
,而rename\u(带大写字母)
被称为rename
。例如:
person.rename("Steve Jones")
person.first_name #=> Steve
person.last_name #=> Jones
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
alias\u method\u chain
是最糟糕的方法调用拦截方式。如果您正在寻找类似的技术,请不要在rails之外使用它。对于“alias\u method\u chain:method,:new\u feature”,您如何引用:method\u而不使用\u new\u feature?:方法成为:new\u功能的别名,因此您似乎无法在没有新功能的情况下引用:method\u?alias\u method\u chain使用两个参数,这两个参数组合起来创建结果方法名称。它没有将一个映射到另一个。@John Owens:请参阅添加的示例。谢谢您提供的所有详细信息。我现在明白你的意思了。我唯一的问题是这些定义在源代码文件中的相对位置是否重要。您的Person示例没有指出“rename”方法在文件中相对于“rename\u with\u capitalize”和“alias\u method\u chain:rename,:capitalize”定义的位置。这有关系吗?此外,alias_method_chain是否始终使用“_with”和“_without”来定义各自的别名?基于您的解释,我假设是这样。虽然在使用alias_method_chain之前必须定义这两个方法,但定义它们的时间或地点并不重要。我没有显示rename方法,因为我们假设它已经存在。如果我们从头开始编写这个类,那么给它们起“with”和“without”的名字会更简单,而不必麻烦使用别名\方法\链。换句话说,我们假设在运行时重新打开Person类以添加其他方法。如果这对您来说没有意义,您需要阅读Ruby的开放类。对于初学者来说: