這是Ruby的測試代碼。爲什麼我不能在我的Ruby對象上調用.capitalize方法?
class Me
puts "i am me"
end
who = Me.new
myself = who.capitalize
我希望字符串「我是我」會返回,但我錯了。 Ruby無法識別來自獨特類的新創建對象的.capitalize方法。將「誰是我」字符串返回給用戶,這很好,但如果我嘗試調用.capitalize,則無法識別該方法。爲什麼?
這是Ruby的測試代碼。爲什麼我不能在我的Ruby對象上調用.capitalize方法?
class Me
puts "i am me"
end
who = Me.new
myself = who.capitalize
我希望字符串「我是我」會返回,但我錯了。 Ruby無法識別來自獨特類的新創建對象的.capitalize方法。將「誰是我」字符串返回給用戶,這很好,但如果我嘗試調用.capitalize,則無法識別該方法。爲什麼?
這是因爲在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
此代碼完全符合我的意圖。我將一個名爲'我'的新變量定義爲Me.new.to_s,並將其作爲'放下自己'然後'放我自己'。這說明了我的許多方面。非常感謝。問候。 – Milktrader 2010-11-09 04:42:44
嘗試在Ruby代碼中使用irb,因爲你有其他人指出的一些誤解。試着弄清楚爲什麼以及上面的代碼是如何工作的,我們在這裏提供幫助;) – Chubas 2010-11-09 05:33:30
謝謝你遭受autodidact。閱讀一本書並說「是的,好吧,我明白了」然後把書放開並開始編寫代碼是一回事。 – Milktrader 2010-11-09 13:51:21
我以爲所有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"
需要放置在Me
的initialize
方法。但即便如此,您也無法在Me
對象上調用String
方法。
此外,您似乎還有一種印象,即您可以在打印完字符串後更改字符串。這當然是不可能的。一旦你在一個字符串上調用puts
,它就會出現在屏幕上,並且你不能拿回來(你可以使用termios
或終端特定的控制序列,但那不是重點)。
好吧,我認爲.capitalize的錯誤是在Object上定義的String上定義的。 – Milktrader 2010-11-09 04:31:35
@Milktrader,試着理解_why_這是一個錯誤......它實際上並沒有使SENSE在所有對象上都存在這樣的方法。例如,如何將數字「5」大寫? – horseyguy 2010-11-09 04:44:35
非常感謝回覆。我多次重新閱讀您的答案,這很有幫助。 – Milktrader 2010-11-09 12:00:07
正如我在我的文檔中看到的,只有String
和Symbol
有capitalize
方法。所以只有他們和他們的孩子班纔有。
哇,嚴重的和基本的誤解會在這裏什麼... :) – horseyguy 2010-11-09 04:43:40
的確。認真的理解並不經常來自一個微不足道的「引用」 - 誤解。 – Milktrader 2010-11-09 12:53:45
當你失敗時,失敗壯觀。 – Milktrader 2010-11-09 15:03:29