2010-11-09 98 views
0

這是Ruby的測試代碼。爲什麼我不能在我的Ruby對象上調用.capitalize方法?

class Me 
    puts "i am me" 
end 

who = Me.new 

myself = who.capitalize 

我希望字符串「我是我」會返回,但我錯了。 Ruby無法識別來自獨特類的新創建對象的.capitalize方法。將「誰是我」字符串返回給用戶,這很好,但如果我嘗試調用.capitalize,則無法識別該方法。爲什麼?

+1

哇,嚴重的和基本的誤解會在這裏什麼... :) – horseyguy 2010-11-09 04:43:40

+0

的確。認真的理解並不經常來自一個微不足道的「引用」 - 誤解。 – Milktrader 2010-11-09 12:53:45

+0

當你失敗時,失敗壯觀。 – Milktrader 2010-11-09 15:03:29

回答

4

這是因爲在String類中定義了方法capitalize

首先,在puts "i am me"你只是執行方法puts行。一旦執行,字符串「我就是我」已經消失了,因爲你沒有提及它,它與我的課無關。

也許這代碼反映你嘗試做

class Me 

    # Returns the string, can be executed by instances of class Me 
    def to_s 
    "i am me" 
    end 

end 

puts Me.new.to_s.capitalize 
+0

此代碼完全符合我的意圖。我將一個名爲'我'的新變量定義爲Me.new.to_s,並將其作爲'放下自己'然後'放我自己'。這說明了我的許多方面。非常感謝。問候。 – Milktrader 2010-11-09 04:42:44

+0

嘗試在Ruby代碼中使用irb,因爲你有其他人指出的一些誤解。試着弄清楚爲什麼以及上面的代碼是如何工作的,我們在這裏提供幫助;) – Chubas 2010-11-09 05:33:30

+0

謝謝你遭受autodidact。閱讀一本書並說「是的,好吧,我明白了」然後把書放開並開始編寫代碼是一回事。 – Milktrader 2010-11-09 13:51:21

3

我以爲所有Ruby對象可以調用.capitalize方法

號你可以打電話some_obj.some_method當且僅當類的some_obj或其超或包含一個模塊定義的方法some_method。這意味着對於可以在任何對象上調用的方法,它需要在所有類的超類(或其包含的模塊之一)的Object類中定義。

capitalize沒有在Object上定義,它在String上定義並有充分的理由。 42.capitalize[].capitalize將是沒有意義的。

class Me 
    puts "i am me" 
end 

此代碼可能不會做你認爲它的作用。當第一次讀取Me的類定義時,將打印字符串i am me。這沒有定義Me類的任何行爲。基本上它是一樣的:

class Me 
end 
puts "i am me" 

I.e.你正在創建一個空的類。

如果你的意圖是字符串i am me應印每次你做Me.new時間,puts "i am me"需要放置在Meinitialize方法。但即便如此,您也無法在Me對象上調用String方法。

此外,您似乎還有一種印象,即您可以在打印完字符串後更改字符串。這當然是不可能的。一旦你在一個字符串上調用puts,它就會出現在屏幕上,並且你不能拿回來(你可以使用termios或終端特定的控制序列,但那不是重點)。

+0

好吧,我認爲.capitalize的錯誤是在Object上定義的String上定義的。 – Milktrader 2010-11-09 04:31:35

+0

@Milktrader,試着理解_why_這是一個錯誤......它實際上並沒有使SENSE在所有對象上都存在這樣的方法。例如,如何將數字「5」大寫? – horseyguy 2010-11-09 04:44:35

+0

非常感謝回覆。我多次重新閱讀您的答案,這很有幫助。 – Milktrader 2010-11-09 12:00:07

1

正如我在我的文檔中看到的,只有StringSymbolcapitalize方法。所以只有他們和他們的孩子班纔有。

相關問題