Оператор "ИЛИ" должен быть помещен в конец предыдущей строки? (неожиданный 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)