Если вы достаточно долго используете ruby, вы откроете для себя and и or операторы.
На первый взгляд это просто синонимы && и ||.
Есть любители использовать буквы, есть любители символов(надо ж показать что вы их знаете),HO надо понимать разницу между ними.
В итоге "and" "or" не ведут себя, как и их символическое родственников. В частности, они имеют гораздо более низкий приоритет.
На данный момент, вы можете матюгнуться если это покажется слишком запутанным.
А если использовать оба варианта то код становится запутанным.
Вообще поведение and и or (как и многое в руби) уходит корнями в перл.
В перле они использовались как операторы if и unless.
Например так:
do_something() or die "It didn't work!";
Эти же операторы в руби преследуют ту же цель.
Для начала "and" и "or" не булёвые операторы, они переключают путь выполнения программы.
and
And используется для цепочек связанных операций когда одна из них может вернуть nil или false.
Пример:
   ` post = Post.find_by_name(name) and post.publish!  `
Тут пост будет опубликован если он найден.
Чем отличается &&? Давайте экспериментировать.
   ` foo = 42 && foo/2  `
`NoMethodError: undefined method /' for nil:NilClass`
`        from (irb):18`
`        from :0`
И что же тут случилось ?
 Скобочки помогут раскрыть тайну:
   `foo = (42 && foo)/2`
Ожидали мы немного другое поведение(теперь-то уже понятно что ожидать такого больше не будем)
   `foo = 42 and foo / 2 => 21  `
…другое дело, все как надо выполнилось.
Другой пример
   1. next if widget = widgets.pop  
Станет:
   ` widget = widgets.pop and next  `
OR
or используется в тех же цепочках операций.
Лучший способ понять эту конструкцию - серия неудачных операций: попробуй способ 1 -> ошибка -> тогда попробуй способ 2 и т.д.
Пример:
   ` foo = get_foo() or raise "Could not find foo!"  `
Пример рефакторинга.
было:
   ` raise "Not ready!" unless ready_to_rock?  `
стало:
   ` ready_to_rock? or raise "Not ready!"  `
Вывод: and и && так же как or и || абсолютно разные инструменты. Использовать надо каждый в своем случае.
Подписаться на:
Комментарии к сообщению (Atom)
 
Комментариев нет:
Отправить комментарий