Как разрешен синтаксис псевдонима 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
использует синтаксис, который ничего больше не может использовать?
- Можно ли использовать этот синтаксис в любом другом контексте?
- В чем преимущество использования этого нечетного синтаксического причуда, когда ничто другое на языке не работает таким образом? Я не вижу заметной пользы от несоответствия этого языка.
Ответы
Ответ 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
(и есть другие аргументы для этого).