在ruby中if(!x)vs if(x == false)

Aar*_*ken 11 ruby

我不明白以下代码:

ruby-1.9.1-p378 > puts "nil is false" unless nil
nil is false
 => nil 
ruby-1.9.1-p378 > puts "nil isn't false" unless nil == false
nil isn't false
 => nil 
Run Code Online (Sandbox Code Playgroud)

在大多数语言中(至少是C语言),if(!cond)和if(cond == false)评估相同.是什么让这不是这样的?

(我想知道原因的细节,我明白这是怎么回事.)

Mar*_*une 31

Ruby认为false并且nil是唯一的两个"虚假"值,而其他一切都是"真实的".这是根据定义,不能修改(至少在MRI中).这个定义适用于所有内置运营商一样if,unless,while,until,cond ? if_truthy : if_falsey,||,&&,...

写作foo == bar总是会调用该==方法上foobar作为参数.默认情况下,nil,false,true和所有其他的立即像符号,等等,都只能等于自己.但是,这可以改变:

def nil.==(bar)
  super || bar == false
end
puts "nil == false" if nil == false  # => "nil == false"
Run Code Online (Sandbox Code Playgroud)

在Ruby 1.9中,您还可以重新定义运算符!,因此unless foo不一定相同if !foo或相反if foo:

def true.!
  true
end

puts "True?"   if  true # => "True?"
puts "or not?" if !true # => "or not?"
Run Code Online (Sandbox Code Playgroud)

不是有人会建议做这样的事情......