[#15357] Regexp literal and Regexp.new() — TAKAHASHI Masayoshi <maki@...>

高橋征義です。

14 messages 2001/12/05
[#15358] Regexp in UTF-8 (Re: Regexp literal and Regexp.new()) — TAKAHASHI Masayoshi <maki@...> 2001/12/05

高橋征義です。むーん、問題のありかが違ったかも。

[#15435] Time#utcoff — Tanaka Akira <akr@...17n.org>

In article <hvosnahj702.fsf@coulee.a02.aist.go.jp>,

20 messages 2001/12/13
[#15436] Re: Time#utcoff — matz@... (Yukihiro Matsumoto) 2001/12/14

まつもと ゆきひろです

[#15505] ERb — m_seki@...

74 messages 2001/12/20
[#15560] Re: ERb — Tanaka Akira <akr@...17n.org> 2001/12/27

In article <20011220114249J.seki@mr.nasu.toshiba.co.jp>,

[#15879] Re: ERb — m_seki@... 2002/02/12

[#15884] Re: ERb — Tanaka Akira <akr@...17n.org> 2002/02/14

In article <m3eljr5o9m.wl@edwin.mva.biglobe.ne.jp>,

[#15885] Re: ERb — m_seki@... 2002/02/14

[#15886] Re: ERb — m_seki@... 2002/02/14

[#15887] Re: ERb — TAKAHASHI Masayoshi <maki@...> 2002/02/14

高橋征義です。

[#15888] Re: ERb — m_seki@... 2002/02/14

[#15896] Re: ERb — Tanaka Akira <akr@...17n.org> 2002/02/15

In article <20020215085405G.seki@mr.nasu.toshiba.co.jp>,

[#15898] Re: ERb — m_seki@... 2002/02/15

[#15900] Re: ERb — TADA Tadashi <sho@...> 2002/02/16

ただただしです。

[#15901] Re: ERb — m_seki@... 2002/02/16

[#15906] Re: ERb — matz@... (Yukihiro Matsumoto) 2002/02/17

まつもと ゆきひろです

[#15909] 1.6 の寿命 (Re: Re: ERb) — Koji Arai <JCA02266@...> 2002/02/17

新井です。

[#15507] fileutils (2) — Minero Aoki <aamine@...>

あおきです。

30 messages 2001/12/20
[#15512] Re: fileutils (2) — TAKAHASHI Masayoshi <maki@...> 2001/12/20

高橋征義です。

[#15513] Re: fileutils (2) — Minero Aoki <aamine@...> 2001/12/21

あおきです。

[#15515] Re: fileutils (2) — TAKAHASHI Masayoshi <maki@...> 2001/12/21

高橋征義です。結論は最後に。

[#15516] Re: fileutils (2) — Minero Aoki <aamine@...> 2001/12/21

あおきです。

[#15533] Re: fileutils (2) — TAKAHASHI Masayoshi <maki@...> 2001/12/22

高橋征義です。

[#15536] Re: fileutils (2) — Minero Aoki <aamine@...> 2001/12/24

あおきです。

[#15540] Re: fileutils (2) — TAKAHASHI Masayoshi <maki@...> 2001/12/24

高橋征義です。

[#15545] Re: fileutils (2) — Minero Aoki <aamine@...> 2001/12/24

あおきです。

[#15557] Re: fileutils (2) — TAKAHASHI Masayoshi <maki@...> 2001/12/26

高橋征義です。

[#15567] Re: fileutils (2) — Minero Aoki <aamine@...> 2001/12/27

あおきです。

[#15573] [patch] resolv.rb for win32 platform — Tietew <tietew-ml-ruby-dev@...>

Tietew です。

22 messages 2001/12/28

[ruby-dev:15512] Re: fileutils (2)

From: TAKAHASHI Masayoshi <maki@...>
Date: 2001-12-20 22:22:44 UTC
List: ruby-dev #15512
高橋征義です。

すみません、つっこみを入れてしまいます。しかも長いです。

Minero Aoki <aamine@mx.edit.ne.jp> wrote:
> 長いあいだ放りだしていたファイル操作モジュール fileutils ですが、
> ようやくまとまりました。最新は
> 
>     http://www.loveruby.net/archive/fileutils.tar.gz
> 
> です。入ってるテストスクリプトは 1.7 じゃないと動きません。

あ、互換性はいったん捨てることにしたんですね。
では、改めて考えてみましょう。

このファイル操作モジュールは、

 * ファイルやディレクトリの作成・移動・削除などを行う
 * 主にインストールの時などに使われる

というものですよね。確かにこういうのがあると、install.rb
とかは書きやすくなって便利そうです。

ここで要求されるモジュールの特徴としては、

 * オプションがいろいろある

というのが第一に挙げられると思います。青木さんの最新版では、
verbose/noop/force/preserveの4つ(さらにrecursiveがメソッド名と
統合されている)が使われています。

fileutilsの最新版ではこれをどう解決しているかというと、

  FileUtils#cd( [options,] dir )

というように、オプションを最初の引数に持ってきてます。ここで
cd(:verbose, :noop, some_dir) とかという感じで指定するわけ
ですね。
このため、dirが何番目の引数になるかは決まってはいない
ようになっています。……うーん、これはちょっとRuby的には
不自然な気が。

なんでこうなっているかというと、

  FileUtils#ln_s( [options,] file1, file2 ..., dir )

というように、任意の数の引数を取るメソッドがあるのと、
Unixのコマンドがオプションを前に持ってくる習慣があるから
だろうと思います(あってます?)。

なお、このようなことをするための実装の方はといえば、

  def newest?( *args )
    (new,*fnames), (verbose,) = fu_parseargs( args, 1..INF, :verbose )

というように、引数は配列で受けて、fu_parseargsでparseしてから、
多重代入で受ける、という感じになっているようです。ちなみにこのINFは、

  INF = 1/0.0

という定義になってますね。うむむむ。

ところで、上のln_sのように、file1,file2,...とたくさん並べる
必要はあるのでしょうか? shell上でその都度コマンドを入力する
ならいざしらず、Rubyのスクリプトならメソッドを並べるなり、
eachで回すなりすればいいような。

それよりも問題はオプションですね。やっぱりシンボルで引数の
前にオプションを置く(ために、引数の絶対位置に意味がなくなる)
のはRubyっぽくないので、なんだか抵抗があります。

では、どういうのがRubyっぽいのか? というのを考えると、やはり
verbose/noop/force/preserveみたいな属性は、オブジェクトの
プロパティとして持たせておく、というのがRubyっぽいような気が
します。そもそもverboseなんてのは、それぞれのメソッドについて
出力してほしいなら全部verbose、そうじゃないなら全部verboseじゃ
ないように指定する方が一般的かと思います。

というわけで、発想を少し(かなり)転換させて、cpやln_sやmkdirと
いった一連のメソッドは、FileUtilsモジュールのモジュール関数
ではなく、FileUtilsクラスのインスタンスメソッドにする、と
いうのはどうでしょうか。
# あるいは名前を変えてFileManagerとかにした方がいいのかもしれ
# ませんが。

こうすると、

   fu = FileUtils.new()
   fu.verbose = true
   fu.noop = true
   dirs.each{|d|
     fu.mkdir(...)
     fu.cp(...)
     ...
   }

という感じに書けるようになります(verboseなどはinitializeの
引数でも指定できるようにした方がいいかも)。

んー、なんか別物っぽくなってしまいますけど、どうでしょうか?

高橋征義 (TAKAHASHI Masayoshi)   E-mail: maki@rubycolor.org

In This Thread