2012-03-13 17 views
4

當在雙引號字符串內插中引用對象時,to_sto_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 2012-03-14 00:54:50

回答

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'。 – 2012-03-13 20:20:14

+0

@Andrew Marshall ['nil.to_s' is「」](http://ruby-doc.org/core-1.9.3/NilClass.html#method-i-to_s)。 – steenslag 2012-03-13 20:49:30

+0

@steenslag不是'「#'',因此'nil'返回值被忽略。 – 2012-03-13 21:40:35

相關問題