Берегитесь операторов and, or и not в Ruby

Илья • 21 сентября 2007 г.

С виду безобидные операторы and,  or  и not могут привести к очень загадочным ошибкам в вашем приложении.

Вот две строчки одинакового кода. В первой строке используются операторы ||  и &&, а во второй операторы  or  и and. Как видите, результат не совпадает:

Всё потому-что в таблице приоритетов операторов в Ruby, оператор && стоит выше оператора ||, в то время как операторы and  и  or находятся на одном уровне.

Что самое неприятное, операторы and  и  or стоят по приоритету даже ниже чем оператор =, а это может создать в коде ошибки следующего типа:

По-скольку оператор = имеет больший приоритет, чем оператор  or, руби сначала присваивает значение false переменной value, а затем сравнивает её со значением true. Получается, что вместо значения true в переменной value, мы получаем значение false.

Такой же код, но с оператором || вместо  or:

Теперь всё работает как надо.

Итак, старайтесь заменять операторы and,  or  и not  на &&, ||  и !. Конечно, вторая тройка не такая красивая и читабельная, но читабельность того не стоит.

4 комментария:

  1. SergeyStasenco:

    Так скорее нужно опасаться операторов || && С and и or как раз понятно, да и скобки добавляют выразительности. Читабильность стоит того чтобы ей уделять внимания.

  2. Илья Сабанин:

    2 Сергей: Я не понял что вы имеете ввиду. Почему стоит опасаться оператора &&?

  3. labria:

    Ну вообще даже в гайдлайнах рельсов написано «не юзайте and и or, юзайте только || и &&»

  4. Дмитрий:

    Опасайтесь своей лени! В любой книге написано, что используйте скобки для расстановки приоритетов! Так же написано, что оператор присваивания имеет более высокий приоритет. И ещё существует таблица приоритетов… Страдают ленивые.

Извините, но комментарии для этой статьи уже закрыты.