Заставьте FalseClass вести себя как TrueClass с метапрограммированием - PullRequest
8 голосов
/ 05 мая 2010

Это теоретический вопрос: возможно ли изменить поведение FalseClass, чтобы оно действовало как TrueClass? Можно переопределить to_s, xor, &, | поведение, но этого недостаточно.

Если вам нравится Test Driven Development, следуйте советам моего коллеги:

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

assert false

Утверждения не будут работать, не так ли? Можно ли успешно сдать тест?

Ответы [ 2 ]

9 голосов
/ 05 мая 2010

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

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

2 голосов
/ 05 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...