Почему оператор return нарушает условный оператор? - PullRequest
12 голосов
/ 13 ноября 2011

Экспериментируя с условным оператором в ruby,

def nada
  false ? true : nil
end

def err
  false ? true : raise('false')
end

работает как положено, но

def reflection
  false ? true : return false
end

производит syntax error, unexpected keyword_false, expecting keyword_end

def reflection
  false ? true : return(false)
end

и попытка с использованием скобок syntax error, unexpected tLPAREN, expecting keyword_end

еще

def reflection
  false ? true : (return false)
end

работает как положено, а более многословно if ... then ... else ... end

def falsy
  if false then true else return false end
end

также работает как положено.

Так что же с условным (троичным) оператором?

Ответы [ 3 ]

19 голосов
/ 13 ноября 2011

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

def reflection
  false ? true : (return false)
end

Конечно, это не имеет особого смысла в использовании, как это, но так как вы экспериментируете (хорошо!) вышеперечисленное работает!Я предполагаю, что ошибка связана с тем, как работает грамматика Ruby - она ​​ожидает, что определенная структура сформирует правильное выражение.

UPDATE

Цитирование некоторой информации из черновая спецификация :

Выражение - это программная конструкция, которая составляет оператор (см. 12).Одно выражение может быть выражением как выражение-выражение (см. 12.2) .12

ПРИМЕЧАНИЕ Различие между выражением и утверждением состоит в том, что выражение обычно используется там, где требуется его значение, но выражение являетсяобычно используется там, где его значение не обязательно требуется.Однако есть некоторые исключения.Например, выражение перехода (см. 11.5.2.4) не имеет значения, и можно использовать значение последнего оператора составного оператора.

Примечание.Выше выражение для прыжка включает в себя return среди прочих.

6 голосов
/ 13 ноября 2011

Я думаю, что все это связано с анализатором ruby.

  • разбирает ruby ​​return как выражение else троичного оператора
  • Затем ruby ​​удивляется, когда находит false вместо end
  • Обтекание return false в скобках заставляет ruby ​​интерпретировать все как выражение else
  • return(false) не работает, потому что ruby ​​все еще пытается интерпретировать только часть return как выражение else,и удивляется, когда находит левую скобку (обновлено)

Примечание: я не думаю, что это отличный ответ.

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

2 голосов
/ 13 ноября 2011

Терренный оператор - это просто оператор. Вы не вернетесь от этого. Вы возвращаетесь из функций. Когда вы помещаете возврат в if, вы возвращаетесь из функции, в которой находится if. Поскольку переменная, ожидающая присваивания из результата if, не существует, проблем нет. Когда вы возвращаетесь из оператора ternery, переменной не присваивается значение.

...