2012-11-13 15 views

答えて

12

docs for the String methodは言う:

は、引数を変換そのto_sメソッドを呼び出すことによってStringに変換します。

一般的には同じですが、いくつかの違いがあります。実際には見えないかもしれませんが、 String()はそのパラメータのクラスをチェックし、まだそれがなければStringto_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" 

あなたは、一般的に、あなたが同じようString()to_sを扱うことができ、このようなStringサブクラスにto_sをオーバーライドする必要がために、これまでそうしているが、何が起こっているのか知っておくと便利かもしれません。

+0

ニースのデモンストレーション! –

2

文字列(オブジェクト)、彼らが失敗したときに彼らは別の例外を発生させる

3

オブジェクトに#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> 
関連する問題