2012-03-13 8 views
4

to_sでもto_strも、二重引用符で囲まれた文字列補間の中でオブジェクトが参照されたときに呼び出されるように見えます。たとえば:Rubyのデフォルトの文字列補間動作をメソッドでオーバーライドする方法はありますか?

# UPDATE: This example actually works as expected. See update below. 
class Foo 
    def to_s 
    'foo' 
    end 

    def to_str 
    to_s 
    end 
end 

"#{Foo.new}" # result: "#<Foo:0x007fb115c512a0>" 

私は、戻り値"foo"を作るために何ができる何かがあると仮定しないのですか?

UPDATE

謝罪、しかし、このコードは実際に動作します。別のコードを間違える

+0

それは誤報に基づいていたにもかかわらず、質問自体がto_s' 'を知らない人たちにいくつかの良い値を提供しません。だから...よくやった! :) – Phrogz

答えて

5

これらの結果は、どのバージョンのRubyで表示されていますか?これは、Ruby 1.9.2と1.8.6で私のために正しく動作:

class Foo 
    def to_s 
    'hi mom' 
    end 
end 

puts "#{Foo.new}" 
#=> hi mom 
4

あなたは文字列を返していません。 putsを削除します。to_sは文字列表現を返し、出力しないためです。

注:この応答は、to_sメソッドのコードがputs "foo"だった以前のバージョンの質問に基づいています。

+1

彼は*何かを返す(Rubyで何かを返さないのは不可能なので)、それはただ彼が望むものではない。実際には補間は 'nil'を返すときに' to_s'を無視するのは興味深いです。 –

+0

@Andrew Marshall ['nil.to_s'は" "](http://ruby-doc.org/core-1.9.3/NilClass.html#method-i-to_s)です。 – steenslag

+0

@steenslagこれは '"# "'ではないので、 'nil'の戻り値は無視されます。 –

関連する問題