String(1.1) == (1.1).to_s => true
String(1.1) === (1.1).to_s => true
これらの2つの強制方法に違いはありますか?もしそうなら、あなたはデモンストレーションできますか?
String(1.1) == (1.1).to_s => true
String(1.1) === (1.1).to_s => true
これらの2つの強制方法に違いはありますか?もしそうなら、あなたはデモンストレーションできますか?
メソッドのドキュメントにはString
次のように書かれています。
to_sメソッドを呼び出して、argを文字列に変換します。
したがって、一般的には同じですが、いくつかの違いがあります。実際にそれらを見る可能性は低いですが。String()
そのパラメータのクラスをチェックし、まだそうでない場合は、String
それを呼び出しますto_s
。to_s
直接呼び出すということは、メソッドが関係なく呼び出されることを意味します。
クラスについて考えてみましょう。
class MyString < String
def to_s
"Overridden to_s method"
end
end
のインスタンスMyString
はすでにString
オブジェクトであるため、パラメータとして渡すとString()
何も起こりません。ただし、それを呼び出すto_s
と、が返されOverridden to_s method
ます。
1.9.3p286 :010 > m = MyString.new 'my string'
=> "my string"
1.9.3p286 :011 > o = String.new 'orig string'
=> "orig string"
1.9.3p286 :012 > String o
=> "orig string"
1.9.3p286 :013 > String m
=> "my string"
1.9.3p286 :014 > o.to_s
=> "orig string"
1.9.3p286 :015 > m.to_s
=> "Overridden to_s method"
このようなサブクラスをオーバーライドする必要はほとんどありません。一般に、同じように扱うことができますがto_s
、何が起こっているのかを知ることは役立つ場合があります。String
String()
to_s
失敗すると、さまざまな例外が発生します。
bo = BasicObject.new
String(bo)
TypeError: can't convert BasicObject into String
bo.to_s
NoMethodError: undefined method `to_s' for #<BasicObject:0x0003efbfd79c10>
String(object)は、オブジェクトに対して#to_sを呼び出すカーネルメソッドです。