Книга: Программирование на языке Ruby
1.5.1. Синтаксис
1.5.1. Синтаксис
Синтаксический анализатор Ruby сложен и склонен прощать многие огрехи. Он пытается понять, что хотел сказать программист, а не навязывать ему жесткие правила. Но к такому поведению надо еще привыкнуть. Вот перечень того, что следует знать о синтаксисе Ruby.
• Скобки при вызове методов, как правило, можно опускать. Все следующие вызовы допустимы:
foobar
foobar()
foobar(a,b,c)
foobar a, b, с
• Коль скоро скобки необязательны, что означает такая запись: x у z
? Оказывается, вот что: «Вызвать метод y
, передав ему параметр z
, а результат передать в виде параметра методу x
.» Иными словами, x(y(z))
. Это поведение в будущем изменится. См. обсуждение поэтического режима в разделе 1.6 ниже.
• Попробуем передать методу хэш:
my_method {а=>1, b=>2}
Это приведет к синтаксической ошибке, поскольку левая фигурная скобка воспринимается как начало блока. В данном случае скобки необходимы:
my_method({а=>1, b=>2})
• Предположим теперь, что хэш — единственный (или последний) параметр метода. Ruby снисходительно разрешает опускать фигурные скобки:
my_method(а=>1, b=>2)
Кто-то увидит здесь вызов метода с именованными параметрами. Это обманчивое впечатление, хотя никто не запрещает применять подобную конструкцию и в таком смысле.
• Есть и другие случаи, когда пропуски имеют некоторое значение. Например, на первый взгляд все четыре выражения ниже означают одно и то же:
x = y + z
x = y+z
x = y+ z
x = y +z
Но фактически эквивалентны лишь первые три. В четвертом же случае анализатор считает, что вызван метод у
с параметром +z
! И выдаст сообщение об ошибке, так как метода с именем у
не существует. Мораль: пользуйтесь пробелами разумно.
• Аналогично x = y*z
— это умножение у
на z
, тогда как x = y *z
— вызов метода у
, которому в качестве параметра передается расширение массива z
.
• В именах идентификаторов знак подчеркивания _
считается строчной буквой. Следовательно, имя идентификатора может начинаться с этого знака, но такой идентификатор не будет считаться константой, даже если следующая буква прописная.
• В линейной последовательности вложенных предложений if
применяется ключевое слово elsif
, а не else if
или elif
, как в некоторых других языках.
• Ключевые слова в Ruby нельзя назвать по-настоящему зарезервированными. Если метод вызывается от имени некоторого объекта (и в других случаях, когда не возникает неоднозначности), имя метода может совпадать с ключевым словом. Но поступайте так с осторожностью, не забывая, что программу будут читать люди.
• Ключевое слово then
(в предложениях if
и case
) необязательно. Если вам кажется, что с ним программа понятнее, включайте его в код. То же относится к слову do
в циклах while
и until
.
• Вопросительный и восклицательный знаки не являются частью идентификатора, который модифицируют, — их следует рассматривать как суффиксы. Таким образом, хотя идентификаторы chop
и chop!
считаются различными, использовать восклицательный знак в любом другом месте имени не разрешается. Аналогично в Ruby есть конструкция defined?
, но defined
— ключевое слово.
• Внутри строки символ решетки #
— признак начала выражения. Значит, в некоторых случаях его следует экранировать обратной косой чертой, но лишь тогда, когда сразу за ним идет символ {
, $
или @
.
• Поскольку вопросительный знак можно добавлять в конец идентификатора, то следует аккуратно расставлять пробелы в тернарном операторе. Пусть, например, имеется переменная my_flag
, которая может принимать значения true
или false
. Тогда первое из следующих предложений правильно, а второе содержит синтаксическую ошибку:
x = my_flag ? 23 : 45 # Правильно.
x = 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__
.
- Вызов хранимых процедур InterBase с использованием стандартного синтаксиса ODBC
- 1.4.4. Использование нетрадиционного синтаксиса на диаграммах функциональной модели
- 1.2. Базовый синтаксис и семантика Ruby
- 7.2. Синтаксис CSS
- Синтаксис множественного фона
- Синтаксис явного INNER JOIN в SQL-92
- Синтаксис языка Bourne shell
- Общий синтаксис скрипта
- Новый синтаксис
- Синтаксис языка и операторы
- Основы синтаксиса Python
- Синтаксис цикла