这是一个理论问题:是否可以将FalseClass行为更改为TrueClass? 可以覆盖to_s,xor和&,|行为但这还不够。
如果您喜欢测试驱动开发,请按照我同事的建议:
puts "false is new true!" if false
puts "never happens" if true
assert false
断言不起作用,不是吗? 是否有可能成功通过测试?
答案 0 :(得分:9)
这是不可能的。考虑它的一种方法是没有可以重新定义的方法Object#truthiness?
。
在Ruby MRI中,真实性测试是RTEST
宏,除了Qfalse
和Qnil
之外,它是硬连线的,两个常数对应false
和{{} 1}}。你必须改变它来重新定义什么是“真理”。
答案 1 :(得分:2)
至少在官方的Ruby实现中,这是不可能的,因为真实和错误的逻辑在C部分深处(Qtrue和Qfalse)。但是,通过覆盖断言来进行断言传递会起作用。此外,您可以使用类似ruby2ruby的内容来解析所有值,但是true仍然不会表现为false,而![]
之类的语句仍然会返回true。另请注意,所有其他对象在if语句和类似的行为中也表现为true。