2013-04-22 12 views
8

Ruby如何使用雙引號初始化新字符串("")與String.new有什麼區別?出於好奇和實驗的目的,我推翻String#initializeRuby如何評估雙引號(又名「」)與String.new?

class String 
    def initialize 
    puts "I <3 bananas" # they're delicious! 
    end 
end 

我試圖弄清楚的是:爲什麼是這兩個例子有什麼不同?

# Calling the String class directly, I can declare banana love! 
irb(main):054:0> String.new 
I <3 bananas 
=> "" 

# Using double quotes, this string is not as tasty :(
irb(main):055:0> "" 
=> "" 

這是惱人的研究,因爲每一個谷歌的結果似乎是專注於基本的Ruby語法,我一直沒能找到Ruby文檔中的任何東西。

+1

如果您改寫'allocate',會發生什麼? – 2013-04-22 03:51:01

+2

@RyanBigg這是一個很好的想法,但它沒有什麼區別。評估字符串文字並在編譯時創建它們的對象,繞過'initialize'和'allocate'。 – 2013-04-22 04:18:32

+0

@Darshan計算,謝謝!這聽起來像我不得不破解並重新編譯源代碼中的Ruby,以便返回初始化的東西。我會閱讀更多的文字。 – amorphid 2013-04-22 05:22:37

回答

9

根據Matz

String對象 的文字在編譯時間,這遠遠 你重新初始化方法之前已創建。單個字符串 來自文字的對象只是已分配和初始化對象的副本。顧名思義,初始化方法的全部目的是 初始化新創建的對象。我不覺得 需要調用字符串 的(重新定義的)初始化方法,它們在編譯時已經初始化。

+0

當然,這也是幾乎所有其他編程語言的工作原理。我知道的只有兩個例子允許文字重載,例如Ioke和Seph。 – 2013-04-22 10:00:50