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

Tou*_*eer 5 ruby overriding boolean

难道不可能性重写像布尔方法truefalseRuby的?

例如

def true
   rand()
end

def false
   rand()
end

true  #=> 0.7548583661438558
false #=> 0.19239076750079454
Run Code Online (Sandbox Code Playgroud)

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

true  #=> true
false #=> false
Run Code Online (Sandbox Code Playgroud)

我想了解这些地方truefalse被定义方法。

我知道&&并且||不能被覆盖,因为&&||是短路运营商。

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

我只是在试验 Ruby。

Ste*_*fan 2

true并且false不能被覆盖,因为它们是关键字,而不是方法。它们的值是硬编码的,无法重新分配不同的值。(至少不是从 Ruby 内部)

即使实现具有相同名称的方法,文字true仍然会解析为内置值。


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

def true.inspect
  rand.to_s
end

true #=> 0.8499100640573652
true #=> 0.22279583303254913
Run Code Online (Sandbox Code Playgroud)

然而,上面的例子实际上并没有以任何方式改变的值。true另外,不要认为true方法调用每次调用时都会返回随机浮点数。我们正在看同一个对象:

a = true

a #=> 0.5813338288658235
a #=> 0.6447125630746154
Run Code Online (Sandbox Code Playgroud)

我们所做的是通过重写来改变它的表示inspect,其中:

返回一个包含人类可读的obj表示的字符串。

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

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

IRB.CurrentContext.inspect_mode = :to_s

a    #=> true
true #=> true
Run Code Online (Sandbox Code Playgroud)