2010-09-24 43 views
8

在Ruby 1.9(YARV),就可以得到像這樣所有已分配的對象數:調用ObjectSpace.count_objects時,散列鍵的含義是什麼?

ObjectSpace.count_objects 

返回像

{:TOTAL=>1226560, :FREE=>244204, :T_OBJECT=>26141, :T_CLASS=>9819, :T_MODULE=>1420, :T_FLOAT=>287, 
:T_STRING=>260476, :T_REGEXP=>4081, :T_ARRAY=>72269, :T_HASH=>14923, :T_STRUCT=>4601, :T_BIGNUM=>7, 
:T_FILE=>16, :T_DATA=>54553, :T_MATCH=>5, :T_COMPLEX=>1, :T_RATIONAL=>15, :T_NODE=>524818, 
:T_ICLASS=>8924} 

什麼是這些哈希鍵的含義哈希?有些像T_STRING和T_FILE是顯而易見的。我特別好奇:FREE,:T_ICLASS,:T_DATA和:T_NODE。

回答

4

只是一個猜測:我認爲:T_ICLASS計數包括類:T_NODE也許可以代表AST節點

這裏有一個完整列表(可惜沒有評論):

#define T_NONE RUBY_T_NONE 
#define T_NIL RUBY_T_NIL 
#define T_OBJECT RUBY_T_OBJECT 
#define T_CLASS RUBY_T_CLASS 
#define T_ICLASS RUBY_T_ICLASS 
#define T_MODULE RUBY_T_MODULE 
#define T_FLOAT RUBY_T_FLOAT 
#define T_STRING RUBY_T_STRING 
#define T_REGEXP RUBY_T_REGEXP 
#define T_ARRAY RUBY_T_ARRAY 
#define T_HASH RUBY_T_HASH 
#define T_STRUCT RUBY_T_STRUCT 
#define T_BIGNUM RUBY_T_BIGNUM 
#define T_FILE RUBY_T_FILE 
#define T_FIXNUM RUBY_T_FIXNUM 
#define T_TRUE RUBY_T_TRUE 
#define T_FALSE RUBY_T_FALSE 
#define T_DATA RUBY_T_DATA 
#define T_MATCH RUBY_T_MATCH 
#define T_SYMBOL RUBY_T_SYMBOL 
#define T_RATIONAL RUBY_T_RATIONAL 
#define T_COMPLEX RUBY_T_COMPLEX 
#define T_UNDEF RUBY_T_UNDEF 
#define T_NODE RUBY_T_NODE 
#define T_ZOMBIE RUBY_T_ZOMBIE 
#define T_MASK RUBY_T_MASK 

RUBY_T_xyz枚舉這樣定義:

enum ruby_value_type { 
    RUBY_T_NONE = 0x00, 

    RUBY_T_OBJECT = 0x01, 
    RUBY_T_CLASS = 0x02, 
    RUBY_T_MODULE = 0x03, 
    RUBY_T_FLOAT = 0x04, 
    RUBY_T_STRING = 0x05, 
    RUBY_T_REGEXP = 0x06, 
    RUBY_T_ARRAY = 0x07, 
    RUBY_T_HASH = 0x08, 
    RUBY_T_STRUCT = 0x09, 
    RUBY_T_BIGNUM = 0x0a, 
    RUBY_T_FILE = 0x0b, 
    RUBY_T_DATA = 0x0c, 
    RUBY_T_MATCH = 0x0d, 
    RUBY_T_COMPLEX = 0x0e, 
    RUBY_T_RATIONAL = 0x0f, 

    RUBY_T_NIL = 0x11, 
    RUBY_T_TRUE = 0x12, 
    RUBY_T_FALSE = 0x13, 
    RUBY_T_SYMBOL = 0x14, 
    RUBY_T_FIXNUM = 0x15, 

    RUBY_T_UNDEF = 0x1b, 
    RUBY_T_NODE = 0x1c, 
    RUBY_T_ICLASS = 0x1d, 
    RUBY_T_ZOMBIE = 0x1e, 

    RUBY_T_MASK = 0x1f 
}; 

我覺得那些最是相當明顯的。唯一我找不到的是T_DATA(參見@ banister的評論),T_ZOMBIET_MASK

BTW:請注意,這些是而不是 Ruby 1.9的一部分。他們是YARV的一部分。他們可能在Ruby 1.9的其他實現上完全不同,甚至根本不存在,全部爲。該文檔明確指出:

返回的散列的內容是實現定義的。將來可能會改變。

事實上,它甚至不保證該方法本身存在:

不希望這種方法除C Ruby的工作。

(通過其作者可能意味着該方法只保證在MRI和YARV工作。)

+1

和':T_DATA'是纏繞的數據結構 – horseyguy 2010-09-24 20:15:36

1

你可以通過調用ObjectSpace.count_tdata_objects獲取有關T_DATA類別的詳細信息(描述here)。

我相信這些是由VM控制的本地對象。有時本機擴展也可以分配它們。

0

的類型的文件doc/extension.doc在Ruby源代碼描述:

T_NIL  :: nil 
T_OBJECT :: ordinary object 
T_CLASS  :: class 
T_MODULE :: module 
T_FLOAT  :: floating point number 
T_STRING :: string 
T_REGEXP :: regular expression 
T_ARRAY  :: array 
T_HASH  :: associative array 
T_STRUCT :: (Ruby) structure 
T_BIGNUM :: multi precision integer 
T_FIXNUM :: Fixnum(31bit or 63bit integer) 
T_COMPLEX :: complex number 
T_RATIONAL :: rational number 
T_FILE  :: IO 
T_TRUE  :: true 
T_FALSE  :: false 
T_DATA  :: data 
T_SYMBOL :: symbol 

此外,還有其他幾種類型的內部使用:

T_ICLASS :: included module 
T_MATCH  :: MatchData object 
T_UNDEF  :: undefined 
T_NODE  :: syntax tree node 
T_ZOMBIE :: object awaiting finalization