我们能在Ruby中重写true和false方法吗



是否可以覆盖Ruby中的truefalse这样的布尔方法?

例如

def true
rand()
end
def false
rand()
end
true  #=> 0.7548583661438558
false #=> 0.19239076750079454

如果我尝试以上操作,我会得到:

true  #=> true
false #=> false

我试图理解这些truefalse方法是在哪里定义的。

我知道&&||不能被覆盖,因为&&||是短循环运算符。

truefalse相似吗?或者它们是在Ruby的某个地方写的?

我只是在试用Ruby。

不能重写truefalse,因为它们是关键字,而不是方法。它们的值是硬编码的,没有办法重新分配不同的值。(至少不是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

最新更新