|| Оператор, вернуть, когда будет известен результат? - PullRequest
10 голосов
/ 12 марта 2011

У меня есть функция, подобная следующей:

def check
  return 2 == 2 || 3 != 2 || 4 != 5
end

Мой вопрос заключается в том, выполнит ли Ruby все сравнения, хотя первое из них истинно, и, таким образом, функция вернет истину. Мои чеки гораздо более интенсивны, поэтому я хотел бы знать, стоит ли мне разбивать их по-другому, чтобы не выполнять все проверки каждый раз.

irb(main):004:0> 2 == 2 || 3 != 2 || 4 != 5
=> true

Спасибо.

Ответы [ 5 ]

15 голосов
/ 12 марта 2011

Ruby использует оценку короткого замыкания .

Это относится как к || и &&.

  • При || правый операнд не оценивается, если левый операнд верен.
  • При && правый операнд не оценивается, если левый операнд ложный.
5 голосов
/ 12 марта 2011

|| короткое замыкание, как только выполняется первое условие. Так что да, это поможет, если вы поставите самые дорогие условия в конце.

2 голосов
/ 12 марта 2011

|| по умолчанию оценивает короткое замыкание, что означает, что как только будет встречено первое «истинное» выражение, оно прекратит оценку (если вы явно не укажете, что хотите, чтобы все выражения оценивались с помощью оператора «или»).

справка:

http://en.wikipedia.org/wiki/Short-circuit_evaluation

0 голосов
/ 05 марта 2015

Вы можете проверить это самостоятельно в irb, например:

irb> p('Hello') || p('World')

Как мы знаем, функция p печатает свои параметры (inspect образом), а затем возвращает их, поэтому если при коротком замыкании || печатается только "Hello", в противном случае оба значения "Hello" и "World" напечатаны.

Вы также можете проверить логический оператор &&, используя puts вместо p, так как puts всегда возвращает nil.

Кстати, irb - идеальное место для игры с рубином. Там вы можете проверить все, кроме небольшой части параллелизма.

0 голосов
/ 12 марта 2011

Как только одно из условий выполнено, функция вернется.

...