10
String(1.1) == (1.1).to_s    => true
String(1.1) === (1.1).to_s   => true

これらの2つの強制方法に違いはありますか?もしそうなら、あなたはデモンストレーションできますか?

4

3 に答える 3

16

メソッドドキュメントにはString次のように書かれています。

to_sメソッドを呼び出して、argを文字列に変換します。

したがって、一般的には同じですが、いくつかの違いがあります。実際にそれらを見る可能性は低いですが。String()そのパラメータのクラスをチェックし、まだそうでない場合は、Stringそれを呼び出しますto_sto_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、何が起こっているのかを知ることは役立つ場合があります。StringString()to_s

于 2012-11-13T21:25:03.540 に答える
5

失敗すると、さまざまな例外が発生します。

bo = BasicObject.new

String(bo)
TypeError: can't convert BasicObject into String

bo.to_s
NoMethodError: undefined method `to_s' for #<BasicObject:0x0003efbfd79c10>
于 2012-11-13T20:30:51.747 に答える
2

String(object)は、オブジェクトに対して#to_sを呼び出すカーネルメソッドです。

于 2012-11-13T20:14:21.000 に答える