とりあえずラムダ式する

「ラムダ式」って、C#だとこんな↓やつ。

x => x + 1

上は「x を受け取って、その x に + 1 した値を返す」ラムダ式。

「ラムダ式」というのは関数(メソッド)を式として表したもの。「=>」は「ラムダ演算子」といって

【引数】 => 【処理】

というふうに使う。

引数は型宣言とともに丸かっこで囲むことになっていて(x には int を受け取るつもりだとして)

(int x) => x + 1

と書くのが本当だけど、コンパイラの型推論が働くのでたいていの場合、型宣言は不要で、また、引数が1つだけの場合は丸かっこを省略できるので最初のような書き方になる。

引数が2つ以上ある場合は関数と同様に「,」でつないで

(x,  y) => 【処理】

引数がない場合は

() => 【処理】

になる。

処理がひとつの式で完結する場合は上記の「式形式のラムダ」でいいけど、処理が複数の文になる場合は「ステートメント形式のラムダ」を使う。

「ステートメント形式のラムダ」では処理を波かっこで囲い、処理内容を普通の関数と同様に記述する。

【引数】 =>
{
    【処理1】;
    //中略    
    return 【処理結果】;
}

処理内容の記述の仕方について、ステートメント形式は普通の関数と同じだけど、式形式の場合「return」は省略される(むしろ書いちゃいけないというのに、最初自分は混乱した。

戻り値のない関数(メソッド)があるように、戻り値がないラムダ式も作ることができる。ステートメント形式は普通の関数と同様に処理内容を書き分ければいいが、式形式の場合は戻り値があろうがなかろうが書く式は一緒になる。これが最初まったく理解できなかった。コンパイラの型推論を知らなかったので…。

C#(というか.net)のコンパイラの型推論はほんと賢くて、式形式のラムダ式の場合、その使われ方(ラムダ式が代入される変数の型)を見て戻り値のあるFunc型か戻値のないAction型かを判別する。なので人間が指定する必要なし!いやむしろするな!…ということみたい。

式形式の場合はその式の値を返す・返さないの2択だから判断はコンパイラに任せていい、いやむしろ任せた方が記述を簡素化できていい、ということなんでしょうね。ステートメント形式の場合は「ステートメント内のどの値を返すのか」を人間が自由に決められないと不便なので、こっちはコンパイラに任せられないけど。

まとめ
  • 「ラムダ式」というのは関数(メソッド)を
    【引数】=> 【処理内容】

    で表したもの。

  • ラムダ式は2種類ある。
    • 式形式
      • 処理内容は一つの式で書く。
      • 式の値をreturnするかどうかはコンパイラが決める。
    • ステートメント形式
      • 処理内容の書き方は普通の関数(メソッド)と一緒。
      • 戻り値がある場合はちゃんとreturn文を書く。

参考ページ