gpt4 book ai didi

ruby - 为什么获取不到分配源信息?

转载 作者:数据小太阳 更新时间:2023-10-29 08:03:12 26 4
gpt4 key购买 nike

1。字符串

当我有一个 non-frozen non-interned 字符串时,我可以获得它的源位置(假设文件名为 foo_file.rb):

require "objspace"
ObjectSpace.trace_object_allocations_start

obj = "foo"
ObjectSpace.allocation_sourcefile(obj) # => foo_file.rb
ObjectSpace.allocation_sourceline(obj) # => 4

当我有一个驻留字符串时,源位置变得不可用(请注意在字符串文字后使用 freeze 的驻留功能):

obj = "foo".freeze
ObjectSpace.allocation_sourcefile(obj) # => nil
ObjectSpace.allocation_sourceline(obj) # => nil

我可以确认这种不可用不是因为它被卡住了,而是因为它被实习了:

obj = "foo"
obj = obj.freeze
ObjectSpace.allocation_sourcefile(obj) # => foo_file.rb
ObjectSpace.allocation_sourceline(obj) # => 4

为什么我无法从 interned 字符串中获取源信息?

2。正则表达式

当我有一个正则表达式时,即使它没有被卡住,我也无法获取源信息:

obj = /foo/
obj.frozen? # => false
ObjectSpace.allocation_sourcefile(obj) # => nil
ObjectSpace.allocation_sourceline(obj) # => nil

为什么我无法从正则表达式中获取源位置,即使它没有被卡住?

最佳答案

这两个对象是在 ObjectSpace.trace_object_allocations_start 调用或执行此文件中的任何其他 Ruby 代码之前简单分配的:

  • "foo".freeze 分配在 compile time by rb_fstring() (最初也在 parse time )

  • 在运行时额外分配 "foo" 只是因为在内部 obj = "foo" 实际上类似于 obj = "foo “.dup。看一下 putstring YARV instruction 的定义和 rb_str_resurrect()功能了解更多详情。

  • /foo/ 分配在 parse time by reg_compile() .就是这样。这里没有重复,所以它总是同一个对象(虽然没有发生实习,但对某些人来说这可能是令人惊讶的行为):

    3.times.map{ "foo".object_id }.uniq         # => [21063740, 21063720, 21063700]
    3.times.map{ "foo".freeze.object_id }.uniq # => [21064340]
    3.times.map{ /foo/.object_id }.uniq # => [21065100]

关于ruby - 为什么获取不到分配源信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35467521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com