いやー、 File.write("zzz4.rb", "class ZZZ; de
File.unlink('zzz1.rb') if File.file?('zzz1.rb') instance_eval do autoload :ZZZ, './zzz1.rb' begin ZZZ rescue LoadError :ok end end }, '[ruby-dev:43816]' assert_equal 'ok', %q{ File.write('zzz2.rb', '') instance_eval do autoload :ZZZ, './zzz2.rb' begin ZZZ rescue NameError :ok end end }, '[ruby-dev:43816]' assert_equal 'ok', %q{ File.write('zzz3.rb', "class ZZZ; def self.ok;:ok;end;end\n") instance_eval do autoload :ZZZ, './zzz3.rb' ZZZ.ok end }, '[ruby-dev:43816]' assert_equal 'ok', %q{ File.write("zzz4.rb", "class ZZZ; def self.ok;:ok;end;end\n") autoload :ZZZ, "./zzz4.rb" ZZZ.ok } assert_equal 'ok', %q{ File.write("zzz5.rb", "class ZZZ; def self.ok;:ok;end;end\n") autoload :ZZZ, "./zzz5.rb" require "./zzz5.rb" ZZZ.ok } assert_equal 'okok', %q{
草 タイトル途中で切れてるやんw
何が起きてるのか説明してくれ。Rubyのバージョンと期待してる挙動も。
簡潔にいうと ・autoloadは定数参照時にファイルを読み込む ・ファイルが見つからなければLoadError ・ファイルはあるけど定数定義が無ければNameError だからassertの期待値が違ってるだけの可能性が高い
実際の例貼るとわかりやすいよ File.write('zzz2.rb','') に autoload して ZZZ を参照すると NameError が出る File.write('zzz1.rb' が無ければ require で LoadError が出る どっちを期待してるんだ
もし狙いが「自動でクラス定義されて動くこと」なら、ファイル内で class ZZZ をちゃんと書くか、require_relative で明示的にロードした方が安全 例: File.write('zzz4.rb', "class ZZZ; def self.ok; :ok; end; end") require_relative './zzz4' ZZZ.ok # => :ok
autoload にパスとして './zzz4.rb' を渡すのは微妙だよ。 require に渡す文字列だから動くこともあるけど、相対パスや $LOAD_PATH 周りで挙動が変わる。 安全策は require_relative か load/require の直接使用。
昔これでハマったわ。empty file 作ってテストして「NameError出るやん」→よく見たらファイルが空だっただけ。 疲れてるとこういう単純ミスを見落とす
それな。まずはファイル中身とパスを確認して、期待する例外を合わせれば解決でしょ 落ち着いてデバッグすれば一瞬