是Ruby';s长度方法是一个符号吗?为什么:长度有时与长度相同?

是Ruby';s长度方法是一个符号吗?为什么:长度有时与长度相同?,ruby,alias,symbols,Ruby,Alias,Symbols,在阅读Ruby中重新定义方法的过程中,我遇到了以下问题: class Array alias :old_length :length def length old_length / 2 end end puts [1, 2, 3].length 当然,这是个坏主意,但它说明了问题。但让我烦恼的是,我们很容易在:length和length和:old_length和old_length之间切换。所以我试着这样做: class Array alias old_length l

在阅读Ruby中重新定义方法的过程中,我遇到了以下问题:

class Array
  alias :old_length :length
  def length
    old_length / 2
  end
end
puts [1, 2, 3].length
当然,这是个坏主意,但它说明了问题。但让我烦恼的是,我们很容易在
:length
length
:old_length
old_length
之间切换。所以我试着这样做:

class Array
  alias old_length length
  def length
    old_length / 2
  end
end
puts [1, 2, 3].length
它工作得很好-显然就像第一个版本一样。我觉得有一些明显的东西我错过了,但我不确定它是什么


简而言之,为什么在这些情况下,
:name
name
是可互换的呢?

alias
是一个需要特殊处理的原语,显然可以同时使用符号和裸名。相关的
alias\u方法
只是一个普通方法,必须使用普通语法

alias_method :old_length, :length

方法不是符号,而是名称。只要写
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
的工作方式不同于该语言中的其他任何东西。

Perfect:这很有帮助,而且不太明显,我会因为不知道它而感到难过。