酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

ラムダ式に挑戦してみた

ラムダ式は名前からして、難しそうなイメージがあって敬遠してました。

食わず嫌いは駄目ポと、(仕事が暇暇なので)思い至ったので、 delegateをろくに使ったこと無い僕が、ラムダ式に挑戦してみた。

まずは、delegateとラムダ式を使ったC#のコードを書いてみました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    delegate int AddDelegate(int x, int y);

    class Program
    {
        static int hoge(int x, int y)
        {
            return x + y;
        }

        static void add(int x, int y, AddDelegate adddelegate)
        {
            Console.WriteLine(adddelegate(x, y));
        }

        static void Main(string[] args)
        {
            // (1.)メソッドを使った足し算
            add(1, 2, hoge);

            // (2.)匿名メソッドを使った足し算
            add(1, 2, delegate(int x, int y) { return x + y; });

            // (3.)ラムダ式を使った足し算
            add(1, 2, (x, y) => x + y);
        }
    }
}

一般的な日本人が英語を聞き取る時には、頭の中で英語を日本語に翻訳しているみたいです。(だから、日本人は英語が下手だって話を昔聞いたね。)

その伝統に倣い、C言語脳の僕はC#のコードをC言語に置き換えてみました。適当に書いたので、コンパイルが通るか怪しいですが……C言語で言えばこんな感じ?

typedef int (AddFunc)(int x, int y);
int hoge(int x, int y)
{
  return x + y;
}

void add(int x, int y, AddFunc func)
{
  printf("%d", func(x, y));
}

void main(void)
{
  // (1.)メソッドを使った足し算
  add(1, 2, hoge);
  // (2.)匿名メソッドを使った足し算
// Cでは確実にコンパイルは通らないのでコメントアウト(・ω・)
// 関数を定義するまでも無いし、名前考えるのが面倒だし
// コーディングが楽になるでしょう的感じ?
//  add(1, 2, (int hoge(int x, int y){return x + y;}) );
}

つまりdelegateは、C言語で言うところの関数ポインタかー。んでもって、C#では関数ポインタを渡さなくても匿名メソッドという方法があって、処理だけを書くってのも大丈夫。

MSDNで答え合わせをしたら、まんま「デリゲートは、C や C++ の関数ポインタと同じように、メソッドを安全にカプセル化する型です。」と書かれていました。 -> こちら.aspx)

次は、ラムダ式ですね。これはさすがにC言語に置き換えは不可能なので、別方面から攻めて行きます。

  // (3.)ラムダ式を使った足し算
  add(1, 2, (x, y) => x + y);

ラムダ式ってのは匿名メソッドの代わりに式だけを書いていると考えても良いのかな。上のコードでは、「(x, y) => x + y」の部分がラムダ式

(x, y)は、入力値であって、=>は、入力値のデータはこう使うんだぜ!という宣言。x + yは、入力値をどう使うか(式)って考え方で当たってるのかな?

具体的にどれだけコーディングが楽になるか、よく判らないなぁ。C言語脳の僕には、匿名メソッドのが直感的なんだけど、単に慣れの問題かな。