私はシンボルについて学んでいますが、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?) は、コード行の「実行」を開始する前に、ファイル全体を一度解析しているようですが、まだクラスを構築していません。おそらくそれはある種の「プレパス」ですか?