Является ли метод длины Руби символом? Почему длина иногда равна длине? - PullRequest
3 голосов
/ 06 июня 2009

Я сталкивался со следующим, читая о том, как легко переопределить методы в 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 взаимозаменяемы в этих случаях?

Ответы [ 2 ]

5 голосов
/ 06 июня 2009

Метод не является символом, но его имя. Просто запись 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 работает иначе, чем все остальное в языке.

3 голосов
/ 06 июня 2009

alias - это примитив, который получает специальную обработку и, очевидно, может принимать как символы, так и голые имена. Связанный alias_method является обычным методом и должен использовать обычный синтаксис.

alias_method :old_length, :length
...