標籤:

Ruby類型、內存調用的若干問題?

最近看Ruby,深深感覺這才是流利的語法狀態,但是還是有一些東西沒有弄清楚,希望有大神能夠幫忙解釋一下。

1. 所有對象的方法都是類的實例方法,都存在類中,Array.class #-&> Class,Integer.class #-&> Class,而且Class有一個實例方法new,那為什麼Integer沒有new方法呢?

2. Ruby應該是一種強類型的語言,每種類型其實都屬於某一個類,那麼當我隱式地轉換類型的時候,解釋器應該會創建一個新的對象(一個轉換後的類的實例),申請並且引用這塊內存,那麼之前的那塊內存內容是自動釋放了嗎?上述了邏輯是我自己理解的,是否有問題?


謝邀。

1. Numeric有new方法,但是Integer沒有,Fixnum, Bignum都沒有new,因為數字是一個立即值,字母量, Ruby不允許你用Integer來創建對象, 對於這些值,你可以暫時理解為,Ruby內部會為他們分配固定的內存地址,所以作為用戶沒有自由分配的權力,所以就沒有new方法。

舉個例子:

1.object_id #=&> 3 # 固定的內存地址

10.object_id #=&> 21

String.new("aaa") #=&> "aaa"

String.new("aaa").object_id #=&> 70154216713160 #new 方法分配的內存地址

但是, 沒有new方法並不意味著它不是一個對象,並不影響Ruby是面向對象語言,一切皆對象的事實。

Update: @Leedy 給出了源碼中移除Integer.new方法的代碼,可以參考下:

rb_undef_method(CLASS_OF(rb_cInteger), "new");

2. 你理解的沒問題。Ruby有GC,也就是垃圾回收處理。 所以是是自動釋放掉了。


我來補充以下,為什麼 Integer 沒有 new 方法,原因是 ruby/numeric.c at trunk · ruby/ruby · GitHub 4057行


第一個問題我突然又想清楚了,實踐了一下,發現Integer.superclass #-&>Numeric,Numeric.method.grep("new") 確實有new方法


推薦閱讀:

這段c++代碼是移動操作嗎?
私自將書中函數代碼編寫出來放到網上分享侵權嗎?
如何評價《自由軟體世界裡的「版權勒索」》?
如果你不用殺毒軟體,能殺毒,弄木馬么?需要不靠軟體去殺毒殺木馬,需要什麼水平或者會什麼?
如何只用16進位編輯器寫出hello_world.exe?

TAG:Ruby | 編程 |