Руби считает, что false
и nil
являются единственными двумя "ложными" значениями, в то время как все остальное является "правдивым". Это по определению и не может быть изменено (по крайней мере, в МРТ). Это определение используется для всех встроенных операторов, таких как 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"
В 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?"
Не то, чтобы кто-нибудь рекомендовал бы делать что-то подобное ...