From: Minero Aoki Date: 2001-12-21T14:24:49+09:00 Subject: [ruby-dev:15516] Re: fileutils (2) あおきです。 In mail "[ruby-dev:15515] Re: fileutils (2)" TAKAHASHI Masayoshi wrote: > 高橋征義です。結論は最後に。 > いやいや、amstd/fileutils.rbとの互換性です(ftools.rbもかな?)。 あ、そっちでしたか。amstd のともだいたい互換のはずです。 というかいま fileutils 自身をパックするのにも使ってますし。 > > ついでに ftools と上位互換でも > > あるはずです (File に extend するとそのまま通用する)。 > > む、しかし引数が違いますよね(verboseとか)。って、そういう意味ではなく? いえ、マニュアルに書いてないだけで、実は最後の verbose 引数は 実装されています。後述するように、true/false でのフラグ渡しは 捨てたいので。 > > でも、メソッド名から言っても cp なら cp(1) のように働いてほしいと > > 思うのではないでしょうか? (本当は話が逆だけど) この場合に限っては > > Ruby 的であるよりもシェル的であるほうがよいのではないかと思うのです。 > > うーん、そうでしょうか。 > 例えば、Dir::mkdirでも、 > mkdir(path [,mode]) > となっています。ftoolsのcpやmvでもverboseオプションは後ろですし。 それは、mkdir(2) があるからでは? cp(2) はないです。 また ftools の verbose は、verbose しかないゆえに迷わず 最後に置けるわけです。noop とかいっぱいついたらどの位置が どのフラグだったかわからなくなるでしょう。 > そうですね、前か後ろだったら、(上のDir::mkdirのように)後ろの方が > 好きです。さらに、引数の位置が決まっていれば安心です。 > # キーワード引数があればまた違うんでしょうけどね……。 キーワード引数と言えば以前は cp a, b, :verbose => true というのを提案して却下されたような記憶があります。 > cp(rb + rb2, mkdir_p(site_ruby + '/tmail')) > とか > (rb+rb2).each{|file| cp(file, mkdir_p(site_ruby + '/tmail'))} > じゃ駄目なんでしょうか? verbose オプションがなければそれでいいかも、と思います。でも verbose がついてるってことは外界にやってることを伝えたいとい うことでしょう。それだったら、やっていることをできるだけまと まりとして伝達するべきです。やりたいのはそれぞれのファイルの cp というよりは、なんらかの意味をもつ集合として複数ファイルを コピーするということでしょう。だから、少なくとも each でバラす のは納得できません。flatten については、まあそのとおりかと思 います。 > > そういうことなら > > > > include FileUtils::Verbose > クラス(クラスメソッド)の振舞いを変えるのにincludeを使うのは > 面白そうだし便利そうなのですが、「凝りすぎ?」という不安も > 若干あるのでした。 あ、それはきっと誤解されてます。include したら変わるのではなく FileUtils::Verbose.cp a, b や include FileUtils::Verbose cp a, b あるいは class F include FileUtils::Verbose end F.new.cp a, b とできるという話です。つまり FileUtils の代用になります。 > オプションはtrue/falseか、あるいは可変長でしょうか。前者なら、 > > def cp(from, to, verbose=false, noop=false) > > という感じ、後者なら、 > > def cp(from, to, *option) # optionは :verbose とかで指定 > > みたいな感じとか。後者の方が使いやすい? たぶん、手で書くには :verbose 方式のほうがいいんですよね。でもスク リプトから FileUtils 自身の振舞いを操作するには :verbose => true や f.verbose = true とやれるほうが楽でしょう。引数の並びで決定する のは、たとえば高橋さんの例だと noop を変えるために全然関係ない verbose も指定しなければいけないのが不満です。 んで、FileUtils::Operator が f.verbose=true 方式、FileUtils が :verbose 方式の実装になっているので、ちょうどいい感じかと思います。 あとは FileUtils のメソッドのオプションの位置か。 ------------------------------------------------------------------- 青木峰郎