Почему выражение Ruby с двойным амперсандом и оператором return вызывает синтаксическую ошибку
def foo
true && return false
end
def bar
true and return false
end
foo
Метод вызывает синтаксическую ошибку. bar
не делает. Зачем?
Предполагая, что я хочу вычислять однострочники с помощью оператора return (аналогично определенному общеупотребительному выражению shell/bash), будет ли это рекомендуемым способом или есть более рекомендуемый подход?
4 ответа
Примечание
Стоит отметить, что and
а также &&
не эквивалентны.
and
является оператором управления потоком в то время как &&
является булевым оператором В чем разница?
Один из примеров различий, используя and
Вы можете назначить значения.
value = nil and value / 42
Это не получится, если вы попробуете, как показано ниже
value = nil && value / 42
Оригинальный Вопрос 1
Предполагая, что я хочу вычислять однострочники с помощью оператора return (аналогично определенному> часто используемому выражению shell/bash), это будет рекомендованным способом или> более рекомендуемым подходом?
Я всегда видел, как это делается в Ruby:
value if conditional
Это вернет значение, если условие выполнено и nil
иначе. Нет необходимости в return
утверждение, если это последняя команда в функции!
Если вы используете это для раннего выхода из функции, я предпочитаю использовать unless
, Например...
return unless arguments_are_valid
Оригинальный вопрос 2
Метод foo вызывает синтаксическую ошибку. бар не Зачем?
Это вопрос приоритета оператора. Смотрите пример ниже, показывающий, как они оцениваются.
(true && return) false
(true) and (return false)
По силе ассоциативности операторов,
true && return false
оценивает
(true && return) false
из которых
true && return
действителен, но false
после того, как это недействительно. Вы не можете выстроить два утверждения без чего-либо промежуточного.
Из-за &&
приоритет оператора, следующая строка
true && return false
оценивает как
(true && return) false
это не имеет смысла. Для выполнения вашего кода вам необходимо использовать
def foo
true && (return false)
end
and
не страдает от той же проблемы, потому что and
имеет более низкий приоритет, чем&&
,
Если есть необходимость в сокращении заявлений, используйте
def foo
return false if true
end
def bar
return false if true
end
return - это не функция:) поэтому не имеет смысла говорить
when true and return is ok send a false