Ruby considers that false
and nil
are the only two "falsy" values, while everything else is "truthy". This is by definition and can not be modified (at least in MRI). This definition is used for all builtin operators like if
, unless
, while
, until
, cond ? if_truthy : if_falsey
, ||
, &&
, ...
Writing foo == bar
will always call the ==
method on foo
with bar
as an argument. By default, nil
, false
, true
and all other immediates like symbols, etc..., are only equal to themselves. This could be changed, though:
def nil.==(bar)
super || bar == false
end
puts "nil == false" if nil == false # => "nil == false"
In Ruby 1.9, you can also redefine the operator !
, so unless foo
is not necessarily the same as if !foo
or the contrary of if foo
:
def true.!
true
end
puts "True?" if true # => "True?"
puts "or not?" if !true # => "or not?"
Not that anybody would recommend doing anything like this...
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…