&& и || vs AND и OR
февраля 27, 2011 | Published in Ruby, Основы | 6 Comments
Статья была признана некоректной и отредактирована! Большая благодарность комментаторам, в частности 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.
От куда взять все эти приоритеты операторов?
февраля 27, 2011 at 14:11 (#)
Я так понимаю основой для твоих рассуждений послужил вот этот пост . Там говорится что, «легче» для восприятия, если понимать and и or как операторы управления потоком выполнения программы. И в идиоматическом руби and и or «должны» выполнять роль модификаторов управления потоком if и unless. Но то что их легче понимать как что-то и они могут использоватся как что-то не делает их чем-то другим чем они есть на самом деле.
&&,|| и and, or — это идентичные логические операторы операторы которые отличаются только старшинством .
февраля 27, 2011 at 14:31 (#)
>> && и || не управляют ходом выполнения программы, они просто объединяют условия.
Как я уже говорил разница с and и or только в старшенстве и как следствие в колличестве круглых скобок нужных для достижения идентичного результата.
февраля 27, 2011 at 15:17 (#)
dre3k, вы правы, одной из статей, по которым я разбрался была именно приведенная вами и та цитата взята от туда. Да, операторы отличаются старшинством, но я не смог понять, как это сформулировать, по этому продемонстрировал все на примерах.Наверное, лучше здесь подходит слово «Приоритет». С таблицей, на которую вы сослались, а уже знаком. += имеет приоритет выше, чем and, однако меньше, чем у &&, поэтому можно наблюдать такое вот поведение:
a, b = 5,10
a+=5 and b+=10
a #=> 10
b #=> 20
a,b = 5,10
a+=5 && b+=10
a #=> 25
b #=> 20
Второй пример равносилен a +=(5 and (b+=10)).
февраля 27, 2011 at 16:44 (#)
Боже, что за статейка…
a == 1 && puts «Ok»
#SyntaxError: (irb):14: syntax error, unexpected tSTRING_BEG, expecting keyword_do or ‘{‘ or ‘(‘
Пишут же, что просто парсер запутался, a == 1 && puts(«Ok») и все, при чем тут все последующие измышления?
> Да, операторы отличаются старшинством, но я не смог понять, как это сформулировать
Той самой табличкой и формулировать. С примерами. И все.
февраля 28, 2011 at 09:39 (#)
в рекомендациях по стилю рекомендация #1 «Используйте && и || вместо AND или OR»
как вы сами поняли у этих операторов высокий приоритет, что заставляет нас использовать скобки повсеместно в условиях, что делает их слабо читаемыми. Наверно стоит пересмотреть рекомендации
октября 22, 2012 at 11:45 (#)
Я бы ещё добавил то что у && приоритет выше чем у ||.
А у or и and одинаковый.
По-моему это очень важно.