2013-03-21 20 views
4

在Ruby中,一切都是一個對象。但是當我在一個數字上嘗試單例方法時,我得到了類型錯誤。是否有任何例外的概念都是對象?Ruby中單例方法是否有例外?

a_str = "Ruby" 
a_num = 100 

def a_str.bark 
    puts "miaow" 
end 

a_str.bark #=> miaow (Good Cat!) 

def a_num.bark 
    puts "miaow" 
end 

a_num.bark #=> TypeError: can't define singleton method "bark" for Fixnum 

回答

4

數字有點特別,因爲它們實際上並不存在於內存中的真實對象。這是不可能的,因爲它們中有無數。

相反,Ruby模擬它們是使用某些約定的對象。即您會注意到Fixnumobject_id總是2 * i + 1(其中i是數字)。使用這個約定,Ruby可以模擬在CPU上表示爲實際普通數字的數字,以使性能和空間限制看起來像Ruby程序中的對象。

由於Fixnum s實際上並不存在於內存中的離散對象,所以不能單獨更改它們。相反,數字被認爲是不可變的。它們大多可用作對象,但不能更改它們,因爲它們不是實際的離散對象。 Ruby中還有其他一些不可變對象,例如false,true,nil

比較而言,字符串將作爲可以更改且不可變的離散ruby對象進行處理。因此它的行爲與所有其他Ruby對象中的大多數相同。