我们可以覆盖 Ruby 中的 true 和 false 方法吗?

Can we overide true and false methods in Ruby?

是否可以覆盖 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 不能被覆盖,因为它们是 keywords,不是方法。它们的值是 hard-coded 并且无法 re-assign 不同的值。 (至少不是来自 Ruby)

即使在实现同名方法时,文字 true 仍将解析为 built-in 值。


你可以做的是改变对象,true 解析为有趣的结果:(这只是为了好玩,不要在实际代码中这样做)

def true.inspect
  rand.to_s
end

true #=> 0.8499100640573652
true #=> 0.22279583303254913

但是,上面的示例实际上并没有以任何方式更改 truevalue。另外,不要将 true 视为每次调用时返回随机浮点数的方法调用。我们正在查看同一个对象:

a = true

a #=> 0.5813338288658235
a #=> 0.6447125630746154

我们所做的是通过覆盖 inspect 来更改其 表示 ,其中:

Returns a string containing a human-readable representation of obj.

我们看到这些浮点数是因为 IRB 调用 inspect 试图以可读的方式打印最后一个表达式的结果。

如果我们将 IRB 的输出模式设置为 :to_s,我们的更改将被绕过,我们再次看到 true

IRB.CurrentContext.inspect_mode = :to_s

a    #=> true
true #=> true