Pull to refresh

Операторы '&&' и 'and' в Ruby

Ruby *
На одном собеседовании меня спросили: «когда ты пишешь на Ruby, ты пользуешься оператором 'and' или двумя символами амперсанда '&&' для обозначения логического 'И' ?». На самом деле, я по старой привычке всегда ставил два символа амперсанда '&&' и никогда не задумывался об этом. Так и ответил, мне сказали «Хорошо».

А вы не смотря под cut можете внятно объяснить разницу между 'and' и '&&' в Ruby?


Допустим у нас есть следующий код.
total = user_messages.empty? and user_messages.total


И какое значение будет у total? Количество сообщений у пользователя? Нет! Все дело в том, что интерпретатор прочитает это так:
(total = user_messages.empty?) and user_messages.total



Значит total станет true или false. Это ведь совсем не то, что вы хотели! Почему так происходит? Просто потому, что есть таблица приоритета операторов в Ruby. Изучив её, понимаем, что можно использовать оператор &&.
Две следующие строки кода абсолютно одинаковы.

total = user_messages.empty? && user_messages.total
total = (user_messages.empty? && user_messages.total)



Аналогичная история с операторами or и ||.
Присмотритесь к своему коду…

P.S. А вот еще пример для окончательного понимания (или непонимания)
irb(main):001:0> x=1
=> 1
irb(main):002:0> y=2
=> 2
irb(main):003:0> x || y && nil
=> 1
irb(main):004:0> x or y and nil
=> nil

Tags:
Hubs:
Total votes 58: ↑41 and ↓17 +24
Views 21K
Comments Comments 77