Статья была признана некоректной и отредактирована! Большая благодарность комментаторам, в частности dre3k
До момента написания предыдущего поста, я и не знал, что && и and чем-то отличаются. В комментариях к предыдущему посту я узнал,что отличия существуют, и как оказывается достаточно значительные.
Что за различия?
&& и AND, || и OR одного поля ягоды, они выполняют абсолютно одинаковую функцию, однако имеют такое, несколько скрытое различие, как приоритет выполнения или старшинство. && и || имеют приоритет выше, чем AND и OR и именно на этом различии основываются все особенности работы с каждым из операторов. Давайте рассмотрим как же приоритет выполнения влияет на работу программы:
nil and a || b соответствует nil and (a || b) и мы получим nil
nil && a || b соответствует (nil and a) || b и мы получим b
Еще примеры:
c = 5 and 10 #=> 10
c #=> 5
Данное выражение соответствует выражению: (c = 5) && 10, поскольку у and приоритет ниже, чем у «=».
c = 5 && 10 #=> 10
c #=> 10
Данное выражение соответствует выражению: с = (5 && 10) , поскольку у && приоритет выполнения выше, чем у «=»
Оператор and можно представить как постфиксный if:
puts "Hello!" if name == "Vladimir!"
идентично:
name == "Vladimir" and puts "Hello!"
Последовательность из OR можно представить как цепочку из «если здесь провал — попробуй это, если и здесь провал — пропробуй это, …», пример:
percent = 30
percent >= 51 or percent = 52
- примерно такой механизм использовали, на последних выборах в Украине.
В Perl и PHP существует такая идиома, как:
do_comthing or die do_something_else
Эту идиому можно реализовать в Ruby не только через unless, но и через or.
От куда взять все эти приоритеты операторов?
http://www.techotopia.com/index.php/Ruby_Operator_Precedence