我有一个带有布尔变量的对象
field :processing, :type => Boolean
我之前的开发人员写了一些代码来说明这一点。
:processing => nil
(出于某种原因,他将其设置为nil而不是false。)
然后他做了这个if语句
return if self.processing
dosomethingelse....
如果我编写执行此操作的代码
:processing => false
下次此代码运行时会发生什么? dosomethingelse运行吗?
return if self.processing
dosomethingelse....
更新===========
对于下面的许多问题,我们将在这里回答。
我添加了这个
field :processing, :type => Boolean, :default => false
它打破了应用程序。当我改变到上面的dosomethingelse永远不会运行?
return if self.processing
返回。有什么建议吗?
更新2 =======================================
以下是对我的代码(编辑)中的处理的每个引用。我也在使用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
答案 0 :(得分:7)
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
答案 1 :(得分:3)
是的,dosomethingelse
开始运行。
在红宝石中(几乎绝对地),一切都是一个物体,每个物体都是“真实的”或“虚假的”。一般来说,除了两个常数nil
和false
之外,一切都是“真实的”。这意味着代码if foo != nil
可以更简洁地编写为if foo
。您根据特定值的“nilness”进行分支 - 类似于您可以在更传统的语言中更明确地检查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
答案 2 :(得分:2)
你可以使用双重否定"施放"一个布尔值的对象:
!!nil # false
!!false # false
!!true # true
一般情况下,只有nil
和false
会将false
作为结果。因此,在if
语句中nil
和false
可以互换。