2011-02-04 69 views
3

爲什麼不能這樣做?String(42)在Ruby中做什麼?

>> s = String 
>> s(42) 
s(42) 
NoMethodError: undefined method `s' for main:Object 
     from (irb):86 
     from /home/sam/.rvm/rubies/ruby-1.9.2-p0/bin/irb:17:in `<main>' 

下一頁。

>> String.new 42 
String.new 42 
TypeError: can't convert Fixnum into String 
     from (irb):90:in `initialize' 
     from (irb):90:in `new' 
     from (irb):90 
     from /home/sam/.rvm/rubies/ruby-1.9.2-p0/bin/irb:17:in `<main>' 

如果String.new不能String()將Fixnum轉換爲String?我假設String()調用to_s。但是,除了要複製的字符串之外,String.new還在尋找什麼?新的別名是dup嗎?

+0

你的兩個問題與彼此無關。請將它們分成兩個問題。 – 2011-02-04 04:41:17

回答

6

之所以s(42)不會在你工作的例子是,有一個名爲String常數(它指向類)以及一個名爲String方法(將參數轉換使用to_s字符串)。當您執行s = String時,s現在將指向與String相同的類。但是,當您撥打s(42)時,ruby將查找名爲s的方法,該方法不存在,並且出現錯誤。

這裏的關鍵是,在紅寶石中可以有一個變量或常量和一個相同名稱的方法,而沒有他們之間有任何關係。

原因String(42)String.new(42)之間的不同的行爲是String電話to_sString.new電話to_str

0

如果你只是想要一個值爲「42」的字符串,那麼你需要做的就是s = "42"

如果你已經有一個Fixnum,你想存儲爲一個字符串,s = some_fixnum.to_s將做到這一點。

+1

我很確定這只是一個學術問題。我認爲(並希望)丹尼爾森先生通常遵循傳統的「」和「to_s」方法。 – 2011-02-04 02:34:45