如果你这样做:
$ nil
=> nil
但是,如果您这样做:
$ !nil
=> true
为什么是真的?
当您在 Ruby 中的对象上使用布尔运算符(如 !
(时,必须首先在后台将对象转换为布尔值(true
或 false
(。Ruby 中的每个对象要么是"真实的",要么是"伪造的",Ruby 的实现者选择了nil
是伪造的,所以!nil
等价于 !false
,其计算结果为 true
。
!
运算符是一元布尔值 NOT。如果其操作数为 nil
或false
,它将返回true
。否则它将返回false
.
!nil # => true
!false # => true
!Object.new # => false
在布尔表达式中,Ruby 始终将nil
和false
视为false
,并将所有其余值视为true
。
因为一般来说,比较,nil 被认为是错误的,所以,如果你这样做:
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"
因此,当你"反转"nil 时,它会变成 false,因为没有一个特定的对象来表示not_being_nil(因为在 Ruby 中不是 nil 的任何值(。