首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么`ObjectSpace.each_object( string )‘几乎包含任何字符串?

为什么`ObjectSpace.each_object( string )‘几乎包含任何字符串?
EN

Stack Overflow用户
提问于 2014-06-05 15:47:54
回答 1查看 176关注 0票数 2

在Mike和Stefan对a question of mine发表评论之后,我注意到ObjectSpace.each_object(String)几乎包含了我能想到的任何字符串:

代码语言:javascript
复制
strings = ObjectSpace.each_object(String)
strings.include?("some random string") # => true

代码语言:javascript
复制
strings = ObjectSpace.each_object(String).to_a
strings.include?("some random string") # => true

我认为strings应该只包含当时存在的字符串。为什么它包含几乎任何字符串?

然而,当我计算strings的长度时,它返回一个有限的数字:

代码语言:javascript
复制
ObjectSpace.each_object(String).to_a.length # => 15780

这在Ruby2.1.2p95(2004-05-08修订版45877) x8664Linux解释器和irb上得到了观察。

这与Ruby2.1中引入的冻结字符串文字优化有关吗?

EN

回答 1

Stack Overflow用户

发布于 2014-06-05 16:13:01

这是因为为了将“一些随机字符串”传递给ObjectSpaceeach_object迭代器上的each_object方法,您必须首先创建字符串“一些随机字符串”。

只需询问ObjectSpace是否存在“一些随机字符串”,您就可以创建“一些随机字符串”,因此它当然存在于对象空间中。明白我在说什么了吗?这就是你的第一个例子。

在第二个示例中,当您在引用“一些随机字符串”之前获得字符串对象数组时,您会认为您将得到false。不过,正如你所指出的,情况并非如此。我认为这是因为您使用的是字符串文字,而Ruby是通过在实际引用字符串之前创建字符串来优化代码的。不过,我对Ruby的内部结构还不太了解,无法深入了解这方面的细节。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24064652

复制
相关文章

相似问题

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