はい!今回は勉強した過程を書いていきます!
ラムダ式の存在は知っていましたが、読み方がなにもわからない"まる"です。
サンプルコードが読めないと処理が把握できないので、
重い腰を上げて勉強することにしました。
STEPを踏んで勉強の過程を残していきます。
ざっくりいうと"要点だけ書いた関数の書き方"と理解しています。
まずusing Systemを追加する。
using System;
・引数無し 戻り値無しの関数の場合
Action型の変数に関数を入れてその変数に括弧()をつけて実行する。
Action aaa = () => { 実行したい処理 };
aaa();
・引数有り 戻り値無しの関数の場合
Action型の変数に関数を入れてその変数に括弧()をつけて実行する。
引数の型はActionの直後に<>で記述する。
Action<引数の型> aaa = (引数の型 引数の変数) => { 実行したい処理};
aaa(引数);
・引数無し 戻り値有りの関数の場合
Func型の変数に関数を入れてその変数に括弧()をつけて実行する。
Funcの直後に<>をつけてその中に戻り値の型を記述する。
Func<戻り値の型> aaa = () => { return○○ };
Debug.Log(aaa());
・引数有り 戻り値有りの関数の場合
Func型の変数に関数を入れてその変数に括弧()をつけて実行する。
Funcの直後に<>をつけてその中に引数の型、戻り値の型の順で記述する。
Func<引数の型,戻り値の型> aaa = (引数の型 引数の変数) =>
{
実行したい処理
return○○
};
Debug.Log(aaa(引数の値));
注)
引数が複数の場合、戻り値の型の記入は最後に記述する。
<第一引数の型,第二引数の型,・・・・・・,戻り値の型>
(ラムダ式を使ううえで、先にデリゲートの考え方を覚えた方がいいようです。)
ポイント
戻り値が無い場合はAction
戻り値が有る場合はFunc
を使うことだけ覚えておく。
サンプルコード
サンプル1 引数無し 戻り値無し 関数
・ 通常の関数の書き方
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ramudatest : MonoBehaviour
{
void Start()
{
aaa();
}
private void aaa()
{
Debug.Log("通常 引数無し 戻り値無し 関数");
}
}
・ラムダ式での書き方
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Ramudatest : MonoBehaviour
{
void Start()
{
Action aaa = () =>{Debug.Log("ラムダ式 引数無し 戻り値無し 関数");};
aaa();
}
}
サンプル2 引数有り 戻り値無し 関数
・通常の関数の書き方
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ramudatest : MonoBehaviour
{
void Start()
{
Test1(5);
}
private void Test1(int number)
{
Debug.Log(number*2);
}
}
・ラムダ式での書き方
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Ramudatest : MonoBehaviour
{
void Start()
{
Action<int> aaa = (int number) => { Debug.Log(number*2);};
aaa(5);
}
}
サンプル3 引数無し 戻り値有り 関数
・通常の関数の書き方
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ramudatest : MonoBehaviour
{
void Start()
{
Debug.Log(Test1());
}
private int Test1()
{
return 1;
}
}
・ ラムダ式での書き方
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Ramudatest : MonoBehaviour
{
void Start()
{
Func<int> aaa = () => { return 1; };
Debug.Log(aaa());
}
}
サンプル4 引数有り 戻り値有り 関数
・通常の関数の書き方
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ramudatest : MonoBehaviour
{
void Start()
{
Debug.Log(Test1(6));
}
private int Test1(int number)
{
number = number * 3;
return number;
}
}
・ ラムダ式での書き方
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Ramudatest : MonoBehaviour
{
void Start()
{
Func<int, int> aaa = (int number) =>
{
number = number * 3;
return number;
};
Debug.Log(aaa(6));
}
}
省略した書き方
次の条件の時に一部を省略して書くことができます。
・引数が1つの場合()と型を省略できる。
・メソッド部分が1行の場合{}を省略できる。
実際にこちらのコードを省略してみます。
Action<int> aaa = (int number) => { Debug.Log(number * 2);};
・引数が1つの場合()と型を省略できる
Action<int> aaa=number=> { Debug.Log(number * 2);};
・メソッド部分が1行の場合{}を省略できる。
Action<int> aaa=number=>Debug.Log(number * 2);
また、引数が複数の場合、型のみ省略することができます。
・引数2つの基本コード
Action<int,float> aaa = (int number,float kazu) => { Debug.Log(number*kazu*2);};
・型のみ省略
Action<int, float> aaa = (number,kazu) => { Debug.Log(number * kazu * 2);};
・さらに、メソッド部分が1行なので{}を省略。
Action<int, float> aaa = (number,kazu) =>Debug.Log(number * kazu * 2);
おわりに
戻り値が無い場合はAction
戻り値が有る場合はFunc
を使うことだけ覚えておく。
有効な使い方はまだ見えていませんが、
ある程度ラムダ式のコードに心の耐性がついた気がします!
実際コードを読む場面では、省略されて書かれていることがほとんどなので、
省略のところは要チェックですね。
参考
squmarigames.com