我们可以覆盖 Ruby 中的 true 和 false 方法吗?
Can we overide true and false methods in Ruby?
是否可以覆盖 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
不能被覆盖,因为它们是 keywords,不是方法。它们的值是 hard-coded 并且无法 re-assign 不同的值。 (至少不是来自 Ruby)
即使在实现同名方法时,文字 true
仍将解析为 built-in 值。
你可以做的是改变对象,true
解析为有趣的结果:(这只是为了好玩,不要在实际代码中这样做)
def true.inspect
rand.to_s
end
true #=> 0.8499100640573652
true #=> 0.22279583303254913
但是,上面的示例实际上并没有以任何方式更改 true
的 value。另外,不要将 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
是否可以覆盖 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
不能被覆盖,因为它们是 keywords,不是方法。它们的值是 hard-coded 并且无法 re-assign 不同的值。 (至少不是来自 Ruby)
即使在实现同名方法时,文字 true
仍将解析为 built-in 值。
你可以做的是改变对象,true
解析为有趣的结果:(这只是为了好玩,不要在实际代码中这样做)
def true.inspect
rand.to_s
end
true #=> 0.8499100640573652
true #=> 0.22279583303254913
但是,上面的示例实际上并没有以任何方式更改 true
的 value。另外,不要将 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