なかだです。

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 #<Pathname:foo>
> 
> Kernel.open は引数の to_open を呼ぶようですが、これは何のために必要
> なんでしょうか。trunk のなかで to_open を定義するクラスは見あたり
> ませんでした。自分で定義したクラスで to_open を定義すると何か嬉しい
> ことがあるのでしょうか。

to_openは最近入ったものなので、pathname.rbが未対応ですね。

Sat Dec  1 10:45:56 2007  Yukihiro Matsumoto  <matz / ruby-lang.org>

	* 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 <tt>File.readlink</tt>. Read symbolic link. def readlink() self.class.new(File.readlink(@path)) end
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦