なかだです。

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>

String以外では常にto_openを呼ぶようになっていますが、Stringに対
してはto_pathは呼ばれることはありません。

At Fri, 7 Dec 2007 10:02:55 +0900,
Nobuyoshi Nakada wrote in [ruby-dev:32474]:
> to_pathはIO専用のto_strの特別版ということだと思います。

ということでよければ、rb_f_open()はto_strではなくてto_pathを使う
ほうがいいと思います。


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: io.c =================================================================== --- io.c (revision 14122) +++ io.c (working copy) @@ -3800,5 +3800,6 @@ rb_f_open(int argc, VALUE *argv) } else { - VALUE tmp = rb_check_string_type(argv[0]); + VALUE tmp = argv[0]; + FilePathValue(tmp); if (NIL_P(tmp)) { redirect = Qtrue;
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦