Каковы значения хеш-ключей при вызове ObjectSpace.count_objects?
В Ruby 1.9 (YARV) вы можете получить счетчик всех выделенных в данный момент объектов, например:
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.
3 ответа
Просто предположение: я предполагаю :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 определяется так:
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_ZOMBIE
а также T_MASK
,
Кстати: обратите внимание, что они не являются частью Ruby 1.9. Они являются частью YARV. Они могут быть совершенно другими в других реализациях Ruby 1.9 или вообще не существовать. В документации четко говорится:
Содержимое возвращаемого хэша определяется реализацией. Это может быть изменено в будущем.
На самом деле, даже не гарантируется, что сам метод существует:
Этот метод не должен работать, кроме C Ruby.
(Под этим автор предположительно подразумевает, что метод гарантированно будет работать только на МРТ и ЯРВ.)
Вы можете получить больше информации о T_DATA
категория по телефону ObjectSpace.count_tdata_objects
(описано здесь).
Я считаю, что это нативные объекты, контролируемые виртуальной машиной. Иногда нативные расширения также могут их размещать.
Типы описаны в файле 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