收集不必要分配给任何变量/常量的对象
未分配给任何变量/常量的对象立即消失(在正常情况下)。 在下面,第三行中的ObjectSpace.each_object(String)
不捕获字符串"foo"
:
strings = ObjectSpace.each_object(String).to_a "foo" ObjectSpace.each_object(String).to_a - strings # => []
是否有可能捕获不必分配给任何变量/常量或任何变量/常量的一部分的对象? 我对捕获字符串特别感兴趣。 相关域可以是文件或块。 我希望如下:
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| ps }' | egrep "aaa|zzz" "\"aaa \#{123} zzz\"; ObjectSpace.each_object(String) { |s| ps }\n" "aaa 123 zzz" " zzz" "aaa "
因此,除非您要创建新的字符串实例(例如,通过将字符串文字指定给变量),否则无法检测字符串创建。 代码执行时它已存在。