なかだです。

At Thu, 8 Jul 1999 00:17:15 +0900,
Minero Aoki <aamine / dp.u-netsurf.ne.jp> wrote:
> それからこれは追加提案ですが、ファイルが複数あるライブラリを使う
> ときには将来の拡張に備えて、次のようなメソッドを介することにしたら
> どうでしょうか。ポイントはコメントアウトしてあるところで、
> ディレクトリをつくらないライブラリもロードできます。
  賛成一票 & patch:-)

-------------------------------------------------------------------
--- use_lib.orig.rb	Thu Jul  8 06:25:44 1999
+++ use_lib.rb	Thu Jul  8 06:57:29 1999
@@ -2,28 +2,22 @@
   if fnames.empty? then
     raise ArgumentError, "filenames required"
   end
-  return if $:.find{|dname| File.basename( dname ) == libname }
 
   # ライブラリに対応するディレクトリを探す
-  targ = nil
-  $:.each do |dname|
-    Dir.foreach( dname ) do |fname|
-      if File.directory? fname and
-         File.basename( fname ) == libname then
-        targ = File.expand_path( dname ) + File::Separator + packname
-        break
-      end
-    end
-    break if targ
-  end
-
-  # みつからなくても(いまのところ)無視する
-  # unless targ then
-  #   raise LoadError, "library #{libname} not exist"
-  # end
+  targ = (catch(:target) {
+	    $:.each {|dname|
+	      dname = File.expand_path(libname, dname)
+	      throw :target, dname if File.directory? dname
+	    }
+	    # みつからなくても(いまのところ)無視する
+	    # raise LoadError, "library #{libname} not exist"
+	  } unless $:.find {|dname| File.basename(dname) == libname})
 
   # ライブラリのファイルをロード
-  $:.unshift targ
-  fnames.each{|f| require f }
-  $:.delete! targ
+  $:.unshift targ if targ
+  begin
+    fnames.each{|f| require f }
+  ensure
+    $:.delete targ
+  end
 end
-------------------------------------------------------------------
# む〜、patch の方がデカいような…

# なんか、Enumerable#find と同じように働くけど、要素じゃなくて評価して真
# になった値を返してくれる(標準的な)のが欲しいな、とか言ってみたり。
## うまい名前が思い付かない...(-_-)

> 第二引数以降はこの実装ではファイル名ですが、将来にはモジュール側が
> スクリプトの中で指定できる「feature」として扱うようにすることも
> 可能でしょう。

  feature => ファイル名のマッピングをどうするか、が気になるところですが。

-- 
♪だって だって だって だって Bugってるから♪
           中田 "ねぇ hoge ってして♪" 伸悦