Почему выражение 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
Другие вопросы по тегам