是否可以覆盖Ruby中的true
和false
这样的布尔方法?
例如
def true
rand()
end
def false
rand()
end
true #=> 0.7548583661438558
false #=> 0.19239076750079454
如果我尝试以上操作,我会得到:
true #=> true
false #=> false
我试图理解这些true
、false
方法是在哪里定义的。
我知道&&
和||
不能被覆盖,因为&&
和||
是短循环运算符。
true
和false
相似吗?或者它们是在Ruby的某个地方写的?
我只是在试用Ruby。
true
和false
,因为它们是关键字,而不是方法。它们的值是硬编码的,没有办法重新分配不同的值。(至少不是Ruby内部(
即使在实现具有相同名称的方法时,文字true
仍将解析为内置值。
您可以做的是更改对象,true
将解析为以获得有趣的结果:(这只是为了好玩,不要在实际代码中这样做(
def true.inspect
rand.to_s
end
true #=> 0.8499100640573652
true #=> 0.22279583303254913
然而,上面的示例实际上并没有以任何方式更改true
的值。此外,不要将true
视为每次调用时返回随机浮点值的方法调用。我们看到的是同一个物体:
a = true
a #=> 0.5813338288658235
a #=> 0.6447125630746154
我们所做的是通过重写inspect
来更改其表示,即:
返回一个字符串,该字符串包含obj的可读表示形式。
我们看到这些浮动是因为IRB调用inspect
试图以可读的方式打印最后一个表达式的结果。
如果我们将IRB的输出模式设置为:to_s
,我们的更改将被绕过,我们将再次看到true
:
IRB.CurrentContext.inspect_mode = :to_s
a #=> true
true #=> true