Это - теоретический вопрос: действительно ли возможно изменить поведение FalseClass для действия как TrueClass? Возможно переопределить to_s, xor, и, | поведение, но это недостаточно.
Если Вы любите Разработку через тестирование, следуете за предложением моего коллеги:
puts "false is new true!" if false
puts "never happens" if true
assert false
Утверждает не будет работать, не так ли? Действительно ли возможно пройти тест успешно?
Это невозможно. Один из способов подумать об этом состоит в том, что не существует метода Object#truthiness?
, который можно было бы переопределить.
В Ruby MRI тест на истинность - это макрос RTEST
который жестко запрограммирован означать что угодно, кроме Qfalse
и Qnil
, двух констант, соответствующих false
и nil
. Вам придется изменить это, чтобы переопределить, что является "истинным", а что нет.
Это невозможно, по крайней мере в официальной реализации Ruby, так как логика true и false находится глубоко в C-части (Qtrue и Qfalse). Заставить assert пройти, однако, можно, перезаписав assert. Кроме того, вы можете использовать что-то вроде ruby2ruby для разбора всех значений, но true все равно не будет вести себя как false, и утверждения типа ![]
все равно вернут true. Также обратите внимание, что все остальные объекты также ведут себя как true в операторах if и подобных.