わたなべです。

tamra / mail.goo.ne.jp <tamra / mail.goo.ne.jp> writes:

:require 'foo' の検索順番が、
:以前:foo.rb -> foo.so
:だったのが、
:現在:foo.so -> foo.rb
:にセキュリティ対策のため変更になったということですね。

以前は
  catch(:break) do
    %w(foo.rb foo.so).each do |foo|
      $:.each do |path|
        throw(:break) if "#{path}/#{foo}"
      end
    end
  end
という感じだったのが
  catch(:break) do
    $:.each do |path|
      %w(foo.rb foo.so).each do |foo|
        throw(:break) if "#{path}/#{foo}"
      end
    end
  end
となったわけです。だからたとえば
  /usr/local/lib/ruby/site_ruby/1.6/foo.rb
  /usr/local/lib/ruby/site_ruby/1.6/foo.so
ならfoo.rbが読まれますが、
  /usr/local/lib/ruby/site_ruby/1.6/foo.rb
  /usr/local/lib/ruby/site_ruby/1.6/i386-cygwin/foo.so
だとfoo.soのほうが先になるのでこっちが優先になります。

% ruby -e 'puts $:'
/usr/local/lib/ruby/site_ruby/1.6/i386-cygwin
/usr/local/lib/ruby/site_ruby/1.6
/usr/local/lib/ruby/site_ruby
/usr/local/lib/ruby/1.6/i386-cygwin
/usr/local/lib/ruby/1.6
. 

MS-DOSの*.com,*.exe,*.batとPATHの関係と同じと考えればいいかな。

-- 
わたなべひろふみ