Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails alias\u方法\u链是否与alias\u方法同义?_Ruby On Rails_Ruby_Alias - Fatal编程技术网

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的开放类。对于初学者来说: