2010-09-24 7 views
8

In Ruby 1.9 (YARV) können Sie eine Anzahl aller aktuell zugewiesenen Objekte wie so erhalten können:Welche Bedeutung haben die Hash-Schlüssel beim Aufruf von ObjectSpace.count_objects?

ObjectSpace.count_objects 

, die einen Hash zurück wie

{: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} 

Was ist die Bedeutung dieser Hash-Schlüssel? Einige wie T_STRING und T_FILE sind offensichtlich. Ich bin besonders neugierig auf: FREE,: T_ICLASS,: T_DATA und: T_NODE.

Antwort

4

Nur eine Vermutung: Ich gehe davon aus :T_ICLASS zählt umfassen Klassen und :T_NODE vielleicht für AST-Knoten stehen konnte.

Hier ist eine vollständige Liste (leider ohne Kommentare):

#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 

Die RUBY_T_xyz Enum ist definiert wie folgt aus:

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 
}; 

Ich denke, die meisten von ihnen sind ziemlich offensichtlich. Die einzigen, die ich nicht herausfinden kann, sind T_DATA (siehe @ Banisters Kommentar), T_ZOMBIE und T_MASK.

BTW: Beachten Sie, dass diese nicht Teil von Ruby 1.9 sind. Sie sind Teil von YARV. Sie können bei anderen Implementierungen von Ruby 1.9 völlig anders sein oder gar nicht existieren überhaupt. Die Dokumentation besagt eindeutig:

Der Inhalt des zurückgegebenen Hash ist Implementierung definiert. Es kann in Zukunft geändert werden.

In der Tat gewährleistet ist es nicht einmal, dass das Verfahren selbst existiert:

außer C Rubin Diese Methode wird nicht erwartet, zu arbeiten.

(von dem der Autor vermutlich bedeutet, dass das Verfahren nur in dem MRT und YARV garantiert arbeiten.)

+1

und ': T_DATA' ist ein Daten gewickelt Struktur – horseyguy

1

Sie können durch Aufruf ObjectSpace.count_tdata_objects (beschrieben here) Weitere Informationen über die T_DATA Kategorie erhalten.

Ich glaube, dass dies native Objekte sind, die von der VM gesteuert werden. Manchmal können native Erweiterungen sie auch zuweisen.

0

Die Typen in der Datei doc/extension.doc in Ruby-Quellcode beschrieben werden:

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 

Darüber hinaus gibt es intern verwendet, um mehrere andere Typen:

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