From: TAKAHASHI Masayoshi Date: 2001-12-22T23:06:23+09:00 Subject: [ruby-dev:15533] Re: fileutils (2) 高橋征義です。 Minero Aoki wrote: > あ、そっちでしたか。amstd のともだいたい互換のはずです。 む、そうですか? と思ったら、 > いえ、マニュアルに書いてないだけで、実は最後の verbose 引数は > 実装されています。 むむむ、そうだったんですね(汗 # しかしそれは自由度が高すぎるような。 > > > でも、メソッド名から言っても cp なら cp(1) のように働いてほしいと > > > 思うのではないでしょうか? (本当は話が逆だけど) この場合に限っては > > > Ruby 的であるよりもシェル的であるほうがよいのではないかと思うのです。 > > > > うーん、そうでしょうか。 > > 例えば、Dir::mkdirでも、 > > mkdir(path [,mode]) > > となっています。ftoolsのcpやmvでもverboseオプションは後ろですし。 > > それは、mkdir(2) があるからでは? cp(2) はないです。 > また ftools の verbose は、verbose しかないゆえに迷わず > 最後に置けるわけです。noop とかいっぱいついたらどの位置が > どのフラグだったかわからなくなるでしょう。 「どの位置なのか分からなくなる」というのは確かにありますね。 でも、今のRubyのメソッドで、「シェル的」なものは確かないと 記憶しているのですが、そこに敢えてシェル的な動作を持ち込む のには慎重になります。少なくとも、引数をごちゃまぜにできる、 というのは混乱を招きやすいのではないでしょうか。 > キーワード引数と言えば以前は > > cp a, b, :verbose => true > > というのを提案して却下されたような記憶があります。 ちょっと記憶にないのですが、どういう理由で却下したんでしたっけ? > verbose オプションがなければそれでいいかも、と思います。でも > verbose がついてるってことは外界にやってることを伝えたいとい > うことでしょう。それだったら、やっていることをできるだけまと > まりとして伝達するべきです。やりたいのはそれぞれのファイルの > cp というよりは、なんらかの意味をもつ集合として複数ファイルを > コピーするということでしょう。だから、少なくとも each でバラす > のは納得できません。flatten については、まあそのとおりかと思 > います。 うーん、これは違うと思います。 verboseについていえば、cpにしろmvにしろ、 ・どんなファイルが、 ・どこにコピー/移動するのか、 という2点がはっきり分かる、というのが何より優先されるのでは ないでしょうか。 # で、「げ、それはまずい。このファイルはこっちのディレクトリに # 入ってもらわないと……」とか思ったりする、と。 そのため、複数のファイルをまとめてcpする場合でも、 foo.rb -> hoge/foo.rb bar.rb -> hoge/bar.rb …… などと、個々のファイルが行ごとに出力されている方がうれしいと 思います。つまりバラすのがデフォルトの方がうれしいのでは。 > あ、それはきっと誤解されてます。include したら変わるのではなく > > FileUtils::Verbose.cp a, b > > や > > include FileUtils::Verbose > cp a, b > > あるいは > > class F > include FileUtils::Verbose > end > F.new.cp a, b > > とできるという話です。つまり FileUtils の代用になります。 なるほど、そうなんですか。って、「ftoolsの代用」ですか? > > オプションはtrue/falseか、あるいは可変長でしょうか。前者なら、 > > > > def cp(from, to, verbose=false, noop=false) > > > > という感じ、後者なら、 > > > > def cp(from, to, *option) # optionは :verbose とかで指定 > > > > みたいな感じとか。後者の方が使いやすい? > > たぶん、手で書くには :verbose 方式のほうがいいんですよね。でもスク > リプトから FileUtils 自身の振舞いを操作するには :verbose => true > や f.verbose = true とやれるほうが楽でしょう。 うーん、でも、たとえばinstall.rb的なものを作るのであれば、 cp(file_a, file_b, $OPT_v, $OPT_n) みたいな指定であまり問題ないのでは。GUIでふにふにする場合にも、 インスタンス変数なりで持たせればいいわけで。 > 引数の並びで決定する > のは、たとえば高橋さんの例だと noop を変えるために全然関係ない > verbose も指定しなければいけないのが不満です。 でも、これは使い方からいくと、原則として指定した方がいい項目 なのでは? どちらかというと、上であおきさんが述べていた「どの 位置がどのフラグだったかわからなくなる」方が問題でしょう。 > んで、FileUtils::Operator が f.verbose=true 方式、FileUtils が > :verbose 方式の実装になっているので、ちょうどいい感じかと思います。 ……Operatorという名前は「演算子」を想起させるのでちょっと……。 やっぱり「Installer」とかかなあ。 高橋征義 (TAKAHASHI Masayoshi) E-mail: maki@rubycolor.org