Подтвердить что ты не робот

Как разрешен синтаксис псевдонима Ruby?

Это поддерживало меня ночью на некоторое время.

class Foo
  def bar
    'bar'
  end

  # What the hell is going on here?!?
  alias :baz :bar
end

Foo.new.baz #=> 'bar'

Почему alias принимает 2 символа в качестве аргументов, но без запятой, разделяющей их? В любом другом контексте это не похоже на синтаксис. И на самом деле, если вы используете запятую, она действительно выдает синтаксическую ошибку.

alias :bar, :baz
# syntax error, unexpected ','

Однако, если я попытаюсь передать 2 символа таким же образом своему методу, он также взрывается:

def somemethod(*args)
  :whatever
end
somemethod :a :b
# syntax error, unexpected ':', expecting $end
  • Итак, почему метод alias использует синтаксис, который ничего больше не может использовать?
  • Можно ли использовать этот синтаксис в любом другом контексте?
  • В чем преимущество использования этого нечетного синтаксического причуда, когда ничто другое на языке не работает таким образом? Я не вижу заметной пользы от несоответствия этого языка.
4b9b3361

Ответ 1

Причина alias работает, потому что это ключевое слово Ruby, похожее на class, def и т.д. Это не метод.

Ключевое слово alias не нуждается в запятой, потому что дизайнеры Ruby решили, что это не так. Ключевые слова по существу жестко закодированы в интерпретаторе.

Существует хорошая причина для alias, когда вам нужно убедиться, что псевдоним происходит во время разбора, а не во время выполнения.

Ключевое слово alias может быть запутанным или неожиданным. Для типичного развития я считаю, что лучше использовать метод Ruby Module#alias_method, который использует запятую и работает во время выполнения.

Здесь хорошее сообщение в блоге о alias и alias_method:

Это связано с тем, что alias является ключевым словом и лексически ограничено. Это означает, что он обрабатывает self как значение self в то время, когда исходный код был прочитан. Напротив, alias_method рассматривает self как значение определяется во время выполнения.

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

Ответ 2

Это не метод, и это не аргументы. alias является одним из немногих ключевых слов в Ruby (см. их все здесь!). Это беспокоит меня, поэтому я переключился на alias_method (и есть другие аргументы для этого).