意外とハマる?classやmodule内に書かれたメソッド以外のプログラムの評価について

test.rb という以下の内容のファイルがあります。

puts "Hello!"

class Fuga
  def self.fuga
   "Ruby!"
  end
end

module Foo
  puts "World!"

  def foo
    "Hatena!"
  end
end

class Hoge
  puts Fuga.fuga

  include Foo
end

hoge = Hoge.new
puts hoge.foo
puts "Diary!"

ruby test.rb と実行すると以下のようになります。

% ruby test.rb  
Hello!
World!
Ruby!
Hatena!
Diary!

classやmodule内に書かれたメソッド以外のプログラムは「Rubyインタプリタが読み込んだ時にすぐ評価される」。なので書く場合は読み込む順番を考慮しないといけないので、注意が必要です。以下はエラーです。

class Hoge
  puts Fuga.fuga
end

class Fuga
  def self.fuga
    "Ruby!"
  end
end

実行結果

% ruby test.rb 
test.rb:2: uninitialized constant Hoge::Fuga (NameError)