3

在阅读有关在 Ruby 中重新定义方法是多么容易时,我遇到了以下问题:

class Array
  alias :old_length :length
  def length
    old_length / 2
  end
end
puts [1, 2, 3].length

当然,这是一个坏主意,但它说明了这一点。但是让我很困扰的是,我们在:lengthandlength:old_lengthand之间切换old_length如此容易。所以我这样尝试:

class Array
  alias old_length length
  def length
    old_length / 2
  end
end
puts [1, 2, 3].length

它工作得很好——显然就像第一个版本一样。我觉得我缺少一些明显的东西,但我不确定它是什么。

那么,简而言之,为什么在这些情况下可以互换:namename

4

2 回答 2

5

方法不是符号,但它的名称是。只是写length调用方法length。要指定方法的名称而不是执行方法,请使用符号。

class Array
  def show_the_difference
    puts length
    puts :length
  end
end

['three', 'items', 'here'].show_the_difference
# prints "3" for the first puts and then "length" for the second

您发现的情况alias是一个例外,只是因为alias与该语言中的其他所有内容都不同。

于 2009-06-05T23:10:45.487 回答
3

alias是一个得到特殊处理的原语,显然可以采用符号和裸名。相关alias_method只是一个普通的方法,必须使用普通的语法。

alias_method :old_length, :length
于 2009-06-05T23:00:20.780 回答