Почему я не могу сделать "если ноль" в рубине? - PullRequest
10 голосов
/ 24 сентября 2010
>> current_user.first_visit
=> 0
>> if current_user.first_visit
>> puts "test"
>> end
test
=> nil

Почему печатается тест?

Ответы [ 3 ]

16 голосов
/ 24 сентября 2010

В Ruby только nil можно рассматривать как аналог false. Не существует предположения, что 0, "" или [] означает false, поэтому вы должны использовать == 0, .blank?, .empty?, .zero? и т. Д.

Но nil не всегда ведет себя как false. Например, при интерполяции строк метод .to_s применяется к содержимому #{}, который работает по-разному для FalseClass и NilClass:

irb(main)> "qwe #{false} rty"
=> "qwe false rty"
irb(main)> "qwe #{nil} rty"
=> "qwe  rty"
6 голосов
/ 24 сентября 2010

Вы можете думать о Ruby, если тестируете либо логическое значение, либо для доступности данных (против nil). Неявное преобразование из 0 в false, поддерживаемое C и (следовательно, другими языками, такими как C ++), было более историческим артефактом за несколько дней до того, как C имел отчетливый булев тип. Здесь он полагается на то, что 0 является удобным дозорным значением или имеет интуитивное значение. Для многих вещей (например, в некоторых странах, где размеры одежды колеблются от 0 до 8, результаты вызова функции POSIX libC) ноль не преобразуется красиво в логически эквивалентный логический, поэтому неплохо, что Ruby идет своим путем.

С этой точки зрения проблема с вашим кодом заключается в том, что current_user.first_visit - имя которого подразумевает логический тип - на самом деле содержит 0, а не false. В качестве альтернативы, если бы у вас был явно числовой current_user.visit_counter, было бы естественно и правильно использовать одно из:

current_user.visit_counter > 0
current_user.visit_counter >= 1
current_user.visit_counter != 0
1 голос
/ 24 сентября 2010

Вы можете попробовать это

>> current_user.first_visit
=> 0
>> if current_user.first_visit != 0
>> puts "test"
>> else
>> puts "fail"
>> end
fail
=>nil

При проверке числовых значений вам также необходимо сопоставить его с ожидаемым значением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...