すがブロ

sugamasaoのhatenablogだよ

require は繰り返すのか?

require すると、require 先のファイルも呼んでくれる

たとえば、以下のような2つのソースがある場合

# test1.rb 
class Test1
  puts "Test1 require"
  def test1
    puts "test1"
  end
end
#test2.rb
require 'test1'

class Test2
  puts "Test2 require"
  def test2
    t = Test1.new
    t.test1
  end
end

上記のような Test2 クラスを require するプログラムを書く。

require 'test2'

puts 'start'
Test1.new.test1
puts 'end'

実行結果

Test1 require # Test1 クラスが読み込まれている
Test2 require # Test2 クラスが読み込まれている
start
test1 # test1 クラスのメソッドが呼ばれている
end

エラーにはならないようだ。 Test1 クラスを明示的に呼んでいなくても、Test2 を経由して require しているので問題なく使用できるのがわかった。
つまり、require の連鎖の中のどっかで require していれば明示しなくてもクラスは使えるというわけである。
ただ、どのクラスを使用しているのか? というのを明示してある方がクラス単体として成り立つ可能性が高いので、明示した方がソース読む人に優しくね? と思う。が、そうなると次の問題がある。

複数回 require されたりしないの?

というわけで、 Test1 及び Test2 はそのまま、それらを呼び出すプログラムを以下のようにして試してみる。
また、明示的に require を繰り返し呼んでどうなるのかも試した。

require 'test1'
require 'test2'

puts 'start'
10.times do
  require 'test1'
end
puts 'end'

実行結果は以下のようになった。

Test1 require
Test2 require
start
end

まとめると

以外と賢いので require は何回やってもその度に呼ばれるようなものではないようだ。
あ、ちなみに、環境は

  • Mac OSX (Leopard)
  • ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]

で試した。
#うーん、前のプロジェクトで何回も requrie されてた箇所がある、なんて話を聞いた覚えがあったんだが・・・