Tou*_*eer 5 ruby overriding boolean
难道不可能性重写像布尔方法true和falseRuby的?
例如
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)
我想了解这些地方true,false被定义方法。
我知道&&并且||不能被覆盖,因为&&和||是短路运营商。
是否true和false相似?或者它们是写在 Ruby 中的某个地方?
我只是在试验 Ruby。
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)