在Mike和Stefan对a question of mine发表评论之后,我注意到ObjectSpace.each_object(String)几乎包含了我能想到的任何字符串:
strings = ObjectSpace.each_object(String)
strings.include?("some random string") # => true或
strings = ObjectSpace.each_object(String).to_a
strings.include?("some random string") # => true我认为strings应该只包含当时存在的字符串。为什么它包含几乎任何字符串?
然而,当我计算strings的长度时,它返回一个有限的数字:
ObjectSpace.each_object(String).to_a.length # => 15780这在Ruby2.1.2p95(2004-05-08修订版45877) x8664Linux解释器和irb上得到了观察。
这与Ruby2.1中引入的冻结字符串文字优化有关吗?
发布于 2014-06-05 16:13:01
这是因为为了将“一些随机字符串”传递给ObjectSpace的each_object迭代器上的each_object方法,您必须首先创建字符串“一些随机字符串”。
只需询问ObjectSpace是否存在“一些随机字符串”,您就可以创建“一些随机字符串”,因此它当然存在于对象空间中。明白我在说什么了吗?这就是你的第一个例子。
在第二个示例中,当您在引用“一些随机字符串”之前获得字符串对象数组时,您会认为您将得到false。不过,正如你所指出的,情况并非如此。我认为这是因为您使用的是字符串文字,而Ruby是通过在实际引用字符串之前创建字符串来优化代码的。不过,我对Ruby的内部结构还不太了解,无法深入了解这方面的细节。
https://stackoverflow.com/questions/24064652
复制相似问题