gpt4 book ai didi

ruby - 收集不一定分配给任何变量/常量的对象

转载 作者:太空宇宙 更新时间:2023-11-03 16:26:23 24 4
gpt4 key购买 nike

没有分配给任何变量/常量的对象会立即消失(在正常情况下)。下面第三行ObjectSpace.each_object(String)没有捕获字符串"foo":

strings = ObjectSpace.each_object(String).to_a
"foo"
ObjectSpace.each_object(String).to_a - strings # => []

是否可以捕获不一定分配给任何变量/常量或任何变量/常量的一部分的对象?我对捕获字符串特别感兴趣。相关域可以是一个文件,也可以是一个 block 。我期待类似以下内容:

capture_all_strings do
...
"a"
s = "b"
@s = "c"
@@s = "d"
S = "e"
%q{f}
...
end
# => ["a", "b", "c", "d", "e", "f"]

最佳答案

Ruby 在解析文件时创建字符串实例。这是一个例子:字符串

"aaa #{123} zzz"

解析为:

$ ruby --dump=parsetree -e '"aaa #{123} zzz"'
###########################################################
## Do NOT use this node dump for any purpose other than ##
## debug and research. Compatibility is not guaranteed. ##
###########################################################

# @ NODE_SCOPE (line: 1)
# +- nd_tbl: (empty)
# +- nd_args:
# | (null node)
# +- nd_body:
# @ NODE_DSTR (line: 1)
# +- nd_lit: "aaa "
# +- nd_next->nd_head:
# | @ NODE_EVSTR (line: 1)
# | +- nd_body:
# | @ NODE_LIT (line: 1)
# | +- nd_lit: 123
# +- nd_next->nd_next:
# @ NODE_ARRAY (line: 1)
# +- nd_alen: 1
# +- nd_head:
# | @ NODE_STR (line: 1)
# | +- nd_lit: " zzz"
# +- nd_next:
# (null node)

解析器阶段有两个字符串文字,"aaa""zzz":

#     +- nd_lit: "aaa "
# ...
# | +- nd_lit: " zzz"

检查 ObjectSpace 确认这些字符串已被实例化:

$ ruby -e '"aaa #{123} zzz"; ObjectSpace.each_object(String) { |s| p s }' | egrep "aaa|zzz"
"\"aaa \#{123} zzz\"; ObjectSpace.each_object(String) { |s| p s }\n"
"aaa 123 zzz"
" zzz"
"aaa "

因此,除非您正在创建一个新的字符串实例(例如,通过将字符串文字分配给一个变量),否则您无法检测到字符串的创建。执行代码时它已经存在了。

关于ruby - 收集不一定分配给任何变量/常量的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24061102/

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