使用元编程使FalseClass表现得像TrueClass

时间:2010-05-05 09:14:26

标签: ruby

这是一个理论问题:是否可以将FalseClass行为更改为TrueClass? 可以覆盖to_s,xor和&,|行为但这还不够。

如果您喜欢测试驱动开发,请按照我同事的建议:

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

assert false

断言不起作用,不是吗? 是否有可能成功通过测试?

2 个答案:

答案 0 :(得分:9)

这是不可能的。考虑它的一种方法是没有可以重新定义的方法Object#truthiness?

在Ruby MRI中,真实性测试是RTEST宏,除了QfalseQnil之外,它是硬连线的,两个常数对应false和{{} 1}}。你必须改变它来重新定义什么是“真理”。

答案 1 :(得分:2)

至少在官方的Ruby实现中,这是不可能的,因为真实和错误的逻辑在C部分深处(Qtrue和Qfalse)。但是,通过覆盖断言来进行断言传递会起作用。此外,您可以使用类似ruby2ruby的内容来解析所有值,但是true仍然不会表现为false,而![]之类的语句仍然会返回true。另请注意,所有其他对象在if语句和类似的行为中也表现为true。