Ruby是真的,假的还是无的

时间:2016-01-04 15:28:50

标签: ruby-on-rails ruby

我有一个带有布尔变量的对象

 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

3 个答案:

答案 0 :(得分:7)

Ruby使用truthyfalsey

falsenilfalsey,其他所有内容均为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开始运行。

在红宝石中(几乎绝对地),一切都是一个物体,每个物体都是“真实的”或“虚假的”。一般来说,除了两个常数nilfalse之外,一切都是“真实的”。这意味着代码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

但有一个重要的警告! falsenil不一样。无论是在语义上还是在实践中。有时您实际上需要一个布尔值,然后您需要确保明确检查该布尔值或nil(取决于您正在测试的内容)。

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

答案 2 :(得分:2)

你可以使用双重否定"施放"一个布尔值的对象:

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

一般情况下,只有nilfalse会将false作为结果。因此,在if语句中nilfalse可以互换。