2012-01-26 58 views
0

如果你这样做:在Ruby中,为什么!nil return => true?

$ nil 
    => nil 

但是,如果你这样做:

$ !nil 
    => true 

为什么为零真的吗?

+1

它还能是什么? “真”是非伪造价值的最合理的候选者。它来自定义。 – sawa

+2

你期望它做什么? –

回答

13

当您在Ruby中的对象上使用布尔运算符(如!)时,必须先将该对象在幕后转换为布尔值(truefalse)。在红宝石每个对象可以是“truthy”或“falsy”和Ruby的实现者已选择nil是falsy,所以!nil相当于!false,其评估对true

+3

当用作表达式时,可能会说它“评估为真”或“评估为假”。正是这种行为允许'!!'被用来把东西渲染成布尔值。 '!nil'是'true','!! nil'是'false'。 – tadman

1

因为在一般情况下,比较,无被视为,所以,如果你这样做:

if something_that_returns_nil 
    puts "did not return nil" 
else 
    puts "returned nil" 

你希望它会产生相反的行为,如果它是:

if !something_that_returns_nil 
    puts "did return nil" 
else 
    puts "did not return nil" 

所以,当你“反转”无它变为假,因为没有表示not_being_nil的特定对象(如不是零就是在Ruby中的任意值)。

4

!运算符是一元布尔非。如果其操作数是nilfalse,它将返回true。否则它将返回false

!nil # => true 
!false # => true 
!Object.new # => false 

在布尔表达式红宝石始终考虑nilfalsefalse和所有其余的值true

相关问题