Ruby if oneliner внутри if, если оператор выдает ошибку - PullRequest
2 голосов
/ 15 сентября 2010

Вот неожиданная находка. Кое-что из очень простой проблемы с Ruby, с которой я не сталкивался раньше:

a = "a"

if a
  test = "yes" if a == "a" else "no"
else
  test = "no"
end

Запуск этого приводит к ошибке:

syntax error, unexpected kELSE, expecting kEND

Похоже, вложенный oneliner выливается в прилагаемый оператор if. Какое обобщенное решение для этого? Не используете oneliner внутри разнесенного оператора if? (Он работает при разрыве вложенного условного выражения, поскольку завершается ключевым словом end.

Кстати, это минимизированный надуманный пример, поэтому не нужно объяснять его глупость или вопрос, зачем я это делаю. Я ищу общее объяснение того, как предотвратить попадание операторов ruby ​​oneliner в условные области.

Ответы [ 4 ]

6 голосов
/ 15 сентября 2010

Если вы хотите поместить if else в одну строку, используйте then следующим образом:

if a then b else c end

и, если хотите, вы можете использовать ; вместо then, напримерэто:

if a ; b else c end

Кроме того, иногда вы можете использовать это вместо ?::

a && b || c
2 голосов
/ 15 сентября 2010
test = "yes" if a == "a" else "no"

не работает, потому что язык не позволяет, попробуйте

test = a == "a" ? "yes" : "no"
0 голосов
/ 16 сентября 2010

Вместо того, чтобы дублировать ответ "нет" в ваших внешних if и else блоках, я бы все переписал:

a = "a"
test = if a && a == "a"
         "yes"
       else
         "no"
       end

Или как однострочник:

a = "a"
test = (a && a == "a") ? "yes" : "no"
0 голосов
/ 15 сентября 2010

Причина ошибки заключается в том, что вы используете 'if модификатор' в этой строке:

test = "yes" if a == "a" else "no"

, если модификаторы принимают только одно условие - следовательно, syntax error, unexpected kELSE, expecting kEND

Asупомянутые другими, троичные операторы идеальны для этих однострочников.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...