2016-01-04 3 views
2

У меня есть объект с булевым var.Ruby true, false или nil

field :processing, :type => Boolean 

Дег передо мной написал код, который говорит об этом.

:processing => nil 

(Он, по какой-то причине, установив ее на ноль вместо ложной.)

Он делает это, если заявление

return if self.processing 
dosomethingelse.... 

Если я пишу код, который делает этот

:processing => false 

Что произойдет в следующий раз при запуске этого кода? Выполняется ли dosomethingelse?

return if self.processing 
dosomethingelse.... 

UPDATE ===========

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

Я добавил этот

field :processing, :type => Boolean, :default => false 

и сломал приложение. Когда я перешел на вышеупомянутый dosomethingelse, он никогда не запускается?
return if self.processing возвращение товара не возможно. Какие-либо предложения?

UPDATE 2 =======================================

Здесь это всякая ссылка на обработку в моем коде (redacted). Также я использую MongoDB, если это имеет значение.

.where(:processing => nil).gt(:retries => 0).asc(:send_time).all.entries 


if self.processing 
end 


return if self.processing 
self.update_attributes(:processing => true) 
dosomethingelse.... 


.where(:sent_time => nil).where(:processing => nil).gt(:retries => 0).asc(:send_time).all.entries 

:processing => nil 
+5

В этом случае 'false' и' nil' должны вести себя одинаково. поэтому да, 'dosomethingelse' должен работать, если': processing => false' – ptierno

+4

'false' и' nil' функция аналогичным образом в условиях. Они отличаются только намерением (для человеческой стороны). Если вы хотите противопоставить 'true', вы используете' false'. Если вы хотите выразить отсутствие значения, вы используете 'nil'. – sawa

+0

Пока вы не проверяете 'self.processing == false', он должен работать одинаково. – sschmeck

ответ

1

Вы можете использовать двойное отрицание, чтобы «бросить» объект в логическое значение:

!!nil # false 
!!false # false 
!!true # true 

В общем, только nil и false дает false как результат. Так, в if заявления nil и false являются взаимозаменяемыми.

+2

не должно быть необходимости. 'if self.processing' должен оцениваться как false, если' self.processing' является 'nil' или' false' – ptierno

+0

Я не хотел использовать двойное отрицание в коде приложения, я только что рекомендовал проверить их поведение – hedgesky

+0

Как двойное отрицание помогает понять, являются ли они взаимозаменяемыми? Как ваша аргументация отличается от высказывания: «У меня есть« 1 »и« 2 », и я умножаю оба на« 0 »соответственно. Теперь оба стали« 0 ». Следовательно,« 1 »и« 2 »одинаковы», ? – sawa

4

Ruby использует truthy и falsey.

false и nil являются falsey, все остальное truthy.

if true 
    puts "true is truthy, duh!" 
else 
    puts "true is falsey, wtf!" 
end 

Выход "true is truthy, duh!"

if nil 
    puts "nil is truthy" 
else 
    puts "nil is falsey" 
end 

Выход "nil is falsey"

if 0 
    puts "0 is truthy" 
else 
    puts "0 is falsey" 
end 

Выход "0 is truthy"

Смотреть это объяснение True and False

3

Да, dosomethingelse получает бег.

В рубине (почти почти абсолютно) все является объектом, и каждый объект является либо «правдивым», либо «ложным». В общем, все «правдиво», за исключением двух констант, nil и false. Это означает, что код if foo != nil может быть написан более лаконично, как if foo. Вы разветвляетесь на основе «нильды» определенного значения - подобно тому, как вы можете более явно проверять на foo == null на более традиционных языках.

Паттерн, в котором много всего проявляется с рубинами хешей. По умолчанию хеш возвращает nil, если отсутствует ключ. Таким образом, у вас может быть код, который работает следующим образом:

def foo(opts = {}) # Optional named arguments 
    # If :bar is not found, than => nil, so the first part of the conditional 
    # evalutates to false and we return the result of the second expression 
    bar = opts[:bar] || default_bar 
end 

Однако есть важное предупреждение! false и nil не совпадают. И семантически, и на практике. Иногда вы действительно хотите логическое, и тогда вам нужно быть уверенным, что вы проверяете явно для этого логического или для nil (в зависимости от того, что вы тестируете).

def display(opts = {}) 
    # This will always result in fullscreen = true! 
    fullscreen = opts[:fullscreen] || true 
end 
+1

'NIL' и' FALSE' являются константами, тогда как 'nil' и' false' являются литералами (или ключевыми словами). – Stefan

+1

Кстати, вы не можете различать отсутствующий ключ и «nil» (или значение по умолчанию для хэша) при использовании 'Hash # []'. Поэтому вы должны использовать ['Hash # fetch'] (http://ruby-doc.org/core-2.3.0/Hash.html # method-i-fetch), который принимает необязательное значение по умолчанию, например. 'opts.fetch (: fullscreen, true)' – Stefan

+0

См. мое редактирование выше, поскольку мой код разбивается, когда по умолчанию задана обработка false. – jdog

Смежные вопросы