我正在学习符号,当我将文件中的所有符号作为文件Symbol.all_symbols
的第一行转储时,我惊讶地发现文件中的所有符号都包含在数组中。但是,如果我尝试访问一个在下面定义的类,我会得到NameError
,换句话说,它是一个无法识别的符号。
puts "DefinedAtEnd is in symbol list: \
#{Symbol.all_symbols.select {|s| s =~ /^DefinedAtEnd/} != nil} "
puts "do_it is in symbol list: \
#{Symbol.all_symbols.select {|s| s =~ /^do_it/} != nil} "
puts "foo is in symbol list: #{Symbol.all_symbols.select {|s| s =~ /^foo/} != nil} "
#d = DefinedAtEnd.new # This will get a NameError
class DefinedAtEnd
def do_it
foo = 'bar'
puts 'In method do_it'
end
end
运行上面得到这个结果:
DefinedAtEnd is in symbol list: true
do_it is in symbol list: true
foo is in symbol list: true
但是,如果我取消注释该行d = DefinedAtEnd.new
,则会收到以下错误:
uninitialized constant DefinedAtEnd (NameError)
似乎解析器(metparser?)在开始“执行”代码行之前对整个文件进行了一次解析,但它还没有构建类。也许这是某种“预通行证”?