From: Nobuyoshi Nakada Date: 2007-12-07T10:02:55+09:00 Subject: [ruby-dev:32474] Re: about to_path and to_open なかだです。 At Thu, 6 Dec 2007 21:34:08 +0900, Yusuke ENDOH wrote in [ruby-dev:32473]: > また、Kernel.open が to_path を呼んでくれないのは仕様でしょうか。 > > require "pathname" > open(Pathname.new("foo")) {|fh| fh.read } > #=> undefined method `to_open' for # > > Kernel.open は引数の to_open を呼ぶようですが、これは何のために必要 > なんでしょうか。trunk のなかで to_open を定義するクラスは見あたり > ませんでした。自分で定義したクラスで to_open を定義すると何か嬉しい > ことがあるのでしょうか。 to_openは最近入ったものなので、pathname.rbが未対応ですね。 Sat Dec 1 10:45:56 2007 Yukihiro Matsumoto * io.c (rb_f_open): use to_open for every non-string object. path object may use method_missing. > もっと些細なことですが、to_path を定義した String を require すると > String 自身が優先されるようです。これは仕様でしょうか。わざわざ > to_path を定義しているのだから、そちらを見てあげる方が気が利いている > ような気がします (本当に些細でごめんなさい) 。 to_pathはIO専用のto_strの特別版ということだと思います。もともと Stringならto_strは呼ばれませんから。to_openならば、openからは呼 ばれるもののrequireからは呼ばれませんが、これが望ましい動作かど うかはよくわかりません。 > require 0 のエラーメッセージのパッチだけ送ります。 これだとto_pathがnilを返したときに無視されることになりませんか。 Index: file.c =================================================================== --- file.c (revision 14122) +++ file.c (working copy) @@ -112,4 +112,7 @@ rb_get_path(VALUE obj) tmp = rb_funcall(obj, to_path, 0, 0); } + else { + tmp = obj; + } exit: StringValueCStr(tmp); Index: lib/pathname.rb =================================================================== --- lib/pathname.rb (revision 14122) +++ lib/pathname.rb (working copy) @@ -799,4 +799,6 @@ class Pathname # * File * end + alias to_open open + # See File.readlink. Read symbolic link. def readlink() self.class.new(File.readlink(@path)) end -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦