Оператор "ИЛИ" должен быть помещен в конец предыдущей строки? (неожиданный tOROP)

Я запускаю Ruby 1.9.

Это допустимый синтаксис:

items = (data['DELETE'] || data['delete'] ||
         data['GET'] || data['get'] || data['POST'] || data['post'])

Но это дает мне ошибку:

items = (data['DELETE'] || data['delete']
         || data['GET'] || data['get'] || data['POST'] || data['post'])

t.rb:8: syntax error, unexpected tOROP, expecting ')'
         || data['GET'] || data['get'] |...
           ^

Почему?

Ответ 1

То, что я могу сказать, "это то, как это работает".

Анализатор Ruby делает удивительную работу, в общем, выяснить, когда выражение должно продолжаться в другой строке. Почти каждый другой язык в мире полностью выполняет эту задачу и требует, чтобы фактический символ либо продолжал следующую строку, либо завершал утверждение.

Как вы знаете, Ruby особенный в этом, почти всегда, он просто показывает это.

В этом случае, однако, есть конфликт. Парсер знает, что ваше выражение еще не закончено, потому что оно все еще ищет ), но может быть составным выражением.

Например, вы могли бы написать что-то вроде этого:

(p :a; p :b; p :c)

... но используя новый терминатор newline вместо ;... этот фактический синтаксис действительно работает:

(p :a
 p :b
 p :c)

(BTW, значение этого выражения является значением последнего выражения в последовательности.)

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

Ответ 2

Ruby интерпретирует конец строки как конец инструкции. Операторы указывают на продолжение утверждения.

Вы можете использовать обратную косую черту \, чтобы указать продолжение, так что следующее будет работать

items = (data['DELETE'] || data['delete'] \
     || data['GET'] || data['get'] || data['POST'] || data['post'])

Ответ 3

Так как ruby ​​ориентирован на линию, операторы, которые заканчиваются оператором, интерпретируются как неполные. Добавление обратной косой черты после того, как оператор позволит интерпретировать многострочный оператор правильно. (источник: http://phrogz.net/ProgrammingRuby/language.html)