From: Yusuke ENDOH Date: 2007-12-06T21:34:08+09:00 Subject: [ruby-dev:32473] about to_path and to_open 遠藤と申します。 くだらないことで恐縮ですが、require 0 の例外メッセージが変です。 $ ./ruby -ve 'require 0' ruby 1.9.0 (2007-12-06 patchlevel 0) [i686-linux] -e:1:in `require': can't convert nil into String (TypeError) from -e:1:in `
' また、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_path などが導入された経緯を知らないので、とんちんかんなことを 言っていたらすみません。 もっと些細なことですが、to_path を定義した String を require すると String 自身が優先されるようです。これは仕様でしょうか。わざわざ to_path を定義しているのだから、そちらを見てあげる方が気が利いている ような気がします (本当に些細でごめんなさい) 。 file = "○×ライブラリ" def file.to_path; "foobar.rb"; end puts "#{ file }をロードします..." require file #=> no such file to load -- ○×ライブラリ require 0 のエラーメッセージのパッチだけ送ります。 Index: file.c =================================================================== --- file.c (revision 14122) +++ file.c (working copy) @@ -111,6 +111,7 @@ if (rb_respond_to(obj, to_path)) { tmp = rb_funcall(obj, to_path, 0, 0); } + if (NIL_P(tmp)) tmp = obj; exit: StringValueCStr(tmp); if (obj != tmp) { -- Yusuke ENDOH