Заставьте FalseClass вести себя как TrueClass с метапрограммированием

Это - теоретический вопрос: действительно ли возможно изменить поведение FalseClass для действия как TrueClass? Возможно переопределить to_s, xor, и, | поведение, но это недостаточно.

Если Вы любите Разработку через тестирование, следуете за предложением моего коллеги:

puts "false is new true!" if false
puts "never happens" if true

assert false

Утверждает не будет работать, не так ли? Действительно ли возможно пройти тест успешно?

8
задан Edvinas Bartkus 5 May 2010 в 09:48
поделиться

2 ответа

Это невозможно. Один из способов подумать об этом состоит в том, что не существует метода Object#truthiness?, который можно было бы переопределить.

В Ruby MRI тест на истинность - это макрос RTEST который жестко запрограммирован означать что угодно, кроме Qfalse и Qnil, двух констант, соответствующих false и nil. Вам придется изменить это, чтобы переопределить, что является "истинным", а что нет.

9
ответ дан 5 December 2019 в 15:21
поделиться

Это невозможно, по крайней мере в официальной реализации Ruby, так как логика true и false находится глубоко в C-части (Qtrue и Qfalse). Заставить assert пройти, однако, можно, перезаписав assert. Кроме того, вы можете использовать что-то вроде ruby2ruby для разбора всех значений, но true все равно не будет вести себя как false, и утверждения типа ![] все равно вернут true. Также обратите внимание, что все остальные объекты также ведут себя как true в операторах if и подобных.

2
ответ дан 5 December 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: