From: "NARUSE, Yui" Date: 2009-11-06T02:05:23+09:00 Subject: [ruby-dev:39649] Re: [Feature:trunk] Dir instance methods for relative path 成瀬です。 Nobuyoshi Nakada wrote: > At Tue, 3 Nov 2009 23:18:49 +0900, > NARUSE, Yui wrote in [ruby-dev:39625]: >> そもそも、根本的に openat の API って実装の都合が出過ぎていませんかね。 >> C 言語の関数ならばともかく、Ruby の API としては、 >> もうちょっとユースケースベースの API にしないと使われない気がします。 >> (使うべき人が使う API でいいやと割り切るという考えもあるでしょうが) > > 何か別のクラスを新設したほうがいい、ということでしょうか。 えぇ、例えば、Fileinfo クラスを作り、親ディレクトリのファイルハンドルと そのディレクトリからの相対パスを持つ。 で、例えば Dir.foreach なら以下のように使う、と。 Dir.foreach("/tmp") do |fileinfo| fileinfo.open{|f| f.read} if fileinfo.file? end >>> ./ruby -v -e 'p open(["ext", "extmk.rb"]){|f|f.gets}}' >>> ./ruby -v -e 'p open([dir, "extmk.rb"]){|f|f.gets}}' >> を許すなら join の手間が省けるので使ってくれるかなぁ。 > > 手間は省けますが、symlink attackには無意味です。 いや、open 内で join するのではなくて、 open の中で ext を開いてから openat で extmk.rb を開いたり、 dir から openat で extmk.rb を開くという話です。 現在 open(File.join(dir, "extmk.rb")){|f|f.gets}} などと書いているところを、 open([dir, "extmk.rb"]) と書くようにさせる、だと受け入れやすいかなと。 -- NARUSE, Yui