首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用ObjectSpace.count_objects时哈希键的含义是什么?

调用ObjectSpace.count_objects时哈希键的含义是什么?
EN

Stack Overflow用户
提问于 2010-09-25 02:35:46
回答 3查看 838关注 0票数 8

在Ruby 1.9 (YARV)中,您可以获得当前分配的所有对象的计数,如下所示:

代码语言:javascript
复制
ObjectSpace.count_objects

它返回的散列如下所示

代码语言:javascript
复制
{: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。

EN

回答 3

Stack Overflow用户

发布于 2010-09-25 02:45:00

仅供猜测:我假设:T_ICLASS计数包括类,而:T_NODE可能代表AST节点。

下面是一个完整的列表(不幸的是没有注释):

代码语言:javascript
复制
#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枚举的定义如下:

代码语言:javascript
复制
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

顺便说一句:注意这些不是Ruby1.9的一部分。他们是YARV的一部分。它们在Ruby1.9的其他实现上可能完全不同,甚至根本不存在。文档清楚地说明:

返回的哈希内容是由实现定义的。它可能会在未来改变。

事实上,甚至不能保证方法本身存在:

除了C

,这个方法是不能工作的。

(作者的意思大概是说,这种方法只保证在MRI和YARV上有效。)

票数 4
EN

Stack Overflow用户

发布于 2017-12-16 00:57:41

您可以通过调用ObjectSpace.count_tdata_objects (描述的here)来获取有关T_DATA类别的更多信息。

我相信这些是由VM控制的本机对象。有时本机扩展也可以分配它们。

票数 1
EN

Stack Overflow用户

发布于 2018-03-05 01:54:16

这些类型在Ruby源代码的doc/extension.doc文件中进行了描述:

代码语言:javascript
复制
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

此外,还可以在内部使用其他几种类型:

代码语言:javascript
复制
T_ICLASS    :: included module
T_MATCH     :: MatchData object
T_UNDEF     :: undefined
T_NODE      :: syntax tree node
T_ZOMBIE    :: object awaiting finalization
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3789929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档