收集不必要分配给任何变量/常量的对象

未分配给任何变量/常量的对象立即消失(在正常情况下)。 在下面,第三行中的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 " 

因此,除非您要创建新的字符串实例(例如,通过将字符串文字指定给变量),否则无法检测字符串创建。 代码执行时它已存在。