我不明白以下代码:
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
总是会调用该==
方法上foo
与bar
作为参数.默认情况下,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)
不是有人会建议做这样的事情......