Синтаксический анализатор Ruby сложен и склонен прощать многие огрехи. Он
пытается понять, что хотел сказать программист, а не навязывать ему жесткие правила.
Но к такому поведению надо еще привыкнуть. Вот перечень того, что следует
знать о синтаксисе Ruby.
• Скобки при вызове методов, как правило, можно опускать. Все следующие
вызовы допустимы:
foobar
foobar()
foobar(a,b,c)
foobar a, b, с
• Коль скоро скобки необязательны, что означает такая запись: х у z? Оказывается,
вот что: «Вызвать методу, передав ему параметр z, а результат передать
в виде параметра методу х.» Иными словами, х (у (z)).
Это поведение в будущем изменится. См. обсуждение поэтического режима
в разделе 1.6 ниже.
• Попробуем передать методу хэш:
my_method {а=>1, Ь=>2}
Это приведет к синтаксической ошибке, поскольку левая фигурная скобка
воспринимается как начало блока. В данном случае скобки необходимы:
my_method({а=>1, Ь=>2})
• Предположим теперь, что хэш - единственный (или последний) параметр
метода. Ruby снисходительно разрешает опускать фигурные скобки:
my_method(а=>1, Ь=>2)
Кто-то увидит здесь вызов метода с именованными параметрами. Это обманчивое
впечатление, хотя никто не запрещает применять подобную конструкцию и
в таком смысле.
• Есть и другие случаи, когда пропуски имеют некоторое значение. Например,
на первый взгляд все четыре выражения ниже означают одно и то же:
х = у + Z
х = y+z
х = у+ Z
X '= у +Z
Но фактически эквивалентны лишь первые три. В четвертом же случае анализатор
считает, что вызван метод у с параметром +z! И выдаст сообщение
об ошибке, так как метода с именем у не существует. Мораль: пользуйтесь
пробелами разумно.
• Аналогично х = y*z - это умножение у на z, тогда как х = у *z-вызов метода
у, которому в качестве параметра передается расширение массива z.
• В именах идентификаторов знак подчеркивания _ считается строчной буквой.
Следовательно, имя идентификатора может начинаться с этого знака,
но такой идентификатор не будет считаться константой, даже если следующая
буква прописная.
• В линейной последовательности вложенных предложений if применяется
ключевое слово elsif, а не else if или elif, как в некоторых других языках.
• Ключевые слова в Ruby нельзя назвать по-настоящему зарезервированными.
Если метод вызывается от имени некоторого объекта (и в других случаях,
когда не возникает неоднозначности), имя метода может совпадать
с ключевым словом. Но поступайте так с осторожностью, не забывая, что
программу будут читать люди.
• Ключевое слово then (в предложениях if и case) необязательно. Если вам
кажется, что с ним программа понятнее, включайте его в код. То же относится
к слову do в циклах while и until.
• Вопросительный и восклицательный знаки не являются частью идентификатора,
который модифицируют, - их следует рассматривать как суффиксы.
Таким образом, хотя идентификаторы chop и chop! считаются различными,
использовать восклицательный знак в любом другом месте имени не
разрешается. Аналогично в Ruby есть конструкция defined?, но defined -
ключевое слово.
• Внутри строки символ решетки # - признак начала выражения. Значит, в
некоторых случаях его следует экранировать обратной косой чертой, но
лишь тогда, когда сразу за ним идет символ {, $ или @.
• Поскольку вопросительный знак можно добавлять в конец идентификатора,
то следует аккуратно расставлять пробелы в тернарном операторе.
Пусть, например, имеется переменная my_f lag, которая может принимать
значения true или false. Тогда первое из следующих предложений правильно,
а второе содержит синтаксическую ошибку:
х = щу_Иад? 23 : 45 # Правильно.
х = my_flag? 23 : 45 # Синтаксическая ошибка.
• Концевой маркер для встроенной документации не следует считать лексемой.
Он помечает строку целиком, поэтому все находящиеся в той же строке
символы не являются частью текста программы, а принадлежат встроенному
документу.
• В Ruby нет произвольных блоков, то есть нельзя начать блок в любом месте,
как в С. Блоки разрешены только там, где они нужны, - например, могут
присоединяться к итератору. Исключение составляет блок begin-end, который
можно употреблять практически везде.
• Не забывайте, что ключевые слова BEGIN И END не имеют ничего общего с
begin и end.
• При статической конкатенации строк приоритет конкатенации ниже, чем у
вызова метода. Например:
str = "Первая " 'second'.center(20) # Примеры 1 and 2
str = "Вторая " + 'second'.center(20) # дают одно и то же.
str = "Первая вторая".center(20) # Примеры 3 and 4
str = ("Первая " + 'вторая').center(20) # дают одно и то же.
• В Ruby есть несколько псевдопеременных, которые выглядят как локальные
переменные, но применяются для особых целей. Это self, nil, true,
false, _FILE_ И _LINE_ .
