C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: rubyのeachの使い方


(過去ログ 43 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■22630 / inTopicNo.1)  rubyのeachの使い方
  
□投稿者/ foo (1回)-(2008/07/28(Mon) 22:30:38)

分類:[その他の言語] 

Rubyに関しての初歩的な質問だと思います。
よろしくお願いします。

ある集合に対するべき集合を求めるための効率的なアルゴリズムを探していて、以下のページを見つけました。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/37116

C#で書きたいのでこに書かれているソースコードをC#に翻訳しようとしているのですが、つまづいています。
それはeachの使い方です。

Rubyにはほとんど触れたことがない私の浅はかな知識の範囲においては、eachは

 [1, 2, 3].each { |i|
  puts i
 }

のように、何らかの「巡回できるもの」に対して呼び出すものだと思っていました。
では、前述のWebページに紹介されているeachは、一体何に対してeachしているのでしょうか?
ドットがないので、どのオブジェクトのメソッドを呼び出しているのか分かりません。

どなたかご教授お願いします。
引用返信 編集キー/
■22632 / inTopicNo.2)  Re[1]: rubyのeachの使い方
□投稿者/ アキラ (91回)-(2008/07/28(Mon) 23:36:38)
アキラ さんの Web サイト
2008/07/28(Mon) 23:39:15 編集(投稿者)
No22630 (foo さん) に返信

class Array
  def power
    ret = []
    0.upto(2**size - 1) { |n|
      a = []
      each { |i|
        a.push i if n & 1 == 1
        n >>= 1
      }
      ret.push a
    }
    ret
  end
end

このプログラムは、 Array クラスの power メソッドの定義なので
each は Array クラス自身のメソッドでしょう。


C# ならこうかな

class List {

    void ForEach(...) {} // ↑の Ruby の Array.each のつもり

    void Foo()
    {
        ForEach(Console.WriteLine); // List.ForEachを呼び出す
    }
}

引用返信 編集キー/
■22633 / inTopicNo.3)  Re[1]: rubyのeachの使い方
□投稿者/ アキラ (92回)-(2008/07/28(Mon) 23:39:18)
アキラ さんの Web サイト
2008/07/28(Mon) 23:40:09 編集(投稿者)
二重投稿のため削除

引用返信 編集キー/
■22647 / inTopicNo.4)  Re[2]: rubyのeachの使い方
□投稿者/ foo (2回)-(2008/07/29(Tue) 10:16:43)
アキラさん、レスありがとうございました。

あぁー、なるほど。

> [1,2,3].power
なんて使い方してるのを見る限り、ArrayはRuby標準(っていうのかな?)のArrayクラスですよね。
となると、このpowerメソッドのように、Rubyって既存のクラスに勝手にメソッド追加できる仕組みがあるわけですね。

> C# ならこうかな
> class List {
>  void ForEach(...) {} // ↑の Ruby の Array.each のつもり
>  void Foo()
>  {
>   ForEach(Console.WriteLine); // List.ForEachを呼び出す
>  }
> }

C#だったら、ともかくForeEachを持ったクラスを作らないといけないわけですね。継承なり自作なりして。
勝手にSystem.Collections.Generic.List<T>やSystem.Arrayにメソッドを追加することはできないわけですし。
解決済み
引用返信 編集キー/
■22653 / inTopicNo.5)  Re[3]: rubyのeachの使い方
□投稿者/ THREE-ONE (1回)-(2008/07/29(Tue) 13:11:31)
THREE-ONE さんの Web サイト
> C#だったら、ともかくForeEachを持ったクラスを作らないといけないわけですね。継承なり自作なりして。
> 勝手にSystem.Collections.Generic.List<T>やSystem.Arrayにメソッドを追加することはできないわけですし。
C# 3.0 ならば拡張メソッド使えば出来ますよ。
public static class Extension
{
    public static void ForEach(this int[] numbers, Action<int> action)
    {
        Array.ForEach<int>(numbers, action);
    }

    public static int[][] Power(this int[] source)
    {
        List<int[]> ret = new List<int[]>();
        int limit = (int) Math.Pow(2, source.Length);
        for (int n = 0; n < limit; n++)
        {
            int m = n;
            List<int> a = new List<int>();
            source.ForEach(i =>
            {
                if ((m & 1) == 1)
                {
                    a.Add(i);
                }
                m >>= 1;
            });
            ret.Add(a.ToArray<int>());
        }
        return ret.ToArray<int[]>();
    }
}
極力似せるとするとこんな感じでしょうか?
Power メソッドだけがほしいなら ForEach メソッドを拡張する必要はありませんが念のため。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -