From: Tanaka Akira Date: 2009-05-10T12:30:51+09:00 Subject: [ruby-dev:38412] Re: Enumerable#gather_each In article <4A063F07.7010304@airemix.jp>, "NARUSE, Yui" writes: > なるほど、ユースケースごとに専用メソッドを用意する方針ですか。 Enumerable の場合、あるメソッドでできないことがあっても他で 実現できないことはないので、なんでもできなければならないとい う要求は小さいですね。 > そうすると確かに問題はどのようなユースケースについて、 > どんな名前のメソッドを用意するかだけなわけですね。 もちろん、少ない知識と記述でたくさんの用途を満たせるに越した ことはないので、どのあたりを狙うかが問題になります。 > Array#compactとか、昔のArray#[]=nilとかを考えるとnilが自然な気もしますが、 > それこそ両方用意した方がいいんじゃないですかね、特定のを除外するのとしないのを。 :delete と :singleton とかかなぁ svn log とかを処理すると区切りは消したくなるので、 % svn log enum.c|./ruby -rpp -e ' sep = "------------------------------------------------------------------------\n" ARGF.gather {|l| l == sep }.each {|lines| pp lines } ' ["------------------------------------------------------------------------\n"] ["r22552 | nobu | 2009-02-22 23:23:33 +0900 (Sun, 22 Feb 2009) | 1 line\n", "\n", "stripped trailing spaces.\n"] ["------------------------------------------------------------------------\n"] ["r21678 | nobu | 2009-01-20 06:47:48 +0900 (Tue, 20 Jan 2009) | 3 lines\n", "\n", "* array.c (take_items), enum.c (enum_zip): tries to convert to\n", " array first. [ruby-core:21442]\n", "\n"] ... ここで ARGF.gather {|l| l == sep ? : :delete : true } にするとか。 > まとめると、必要なのは > * 引数であるprocの戻り値ごとにまとめる基本メソッド > * 一部を捨てるメソッド > * 特定の要素の直前で分けるメソッド > * 特定の要素の直後で分けるメソッド > あたりなのでしょうか どれが基本かどうかというのはとくに意識しなくていいんじゃない ですかね。たぶん slice_by を使って gather を実現するのはでき る気がします。 直後で分ける用途は充分にたくさんあるんですかねぇ。それは よくわかりません。作ることになったときに名前に悩まないように しておくのはいいかもしれませんが。直前を slice_before にして おいて、必要になったときには slice_after を作るとか。 あと、専用メソッドを増やせば増やすほどいいというわけでもあり ません。メソッドが増えるとどれが適切かユーザが選ばないといけ ませんから。記述が繁雑にならないなら、ひとつのメソッドの機能 を増やすというのも選択肢になります。そうすれば、うまく動かな かったときにメソッドを選ぶところからやり直すのでなく、ブロッ クの中をいじるだけで修正していける可能性が増します。 -- [田中 哲][たなか あきら][Tanaka Akira]