いちにちいちにちざっかん

一日一個思ったことを書きたかった成れの果て。

コルーチンの謎

イマイチコルーチンがわからんのでUnityでサンプルコードを書いてみた。

using UnityEngine;
using System.Collections;

public class yieldSample : MonoBehaviour {

    void Start () {
        YieldTest();
    }

    void YieldTest()
    {
        // イテレータでAppleを回す。
        foreach(object n in Apple())
        {
            Debug.Log(n);
            Debug.Log("---");
        }
    }

    // コルーチンApple
    private IEnumerable Apple()
    {
        // 無限ループ。ただしiが20になったらブレイクして抜ける。
        for(int i = 0 ; true ; i++)
        {
            // iが20になったらブレイク
            if(i == 20) yield break;
            // そうでないときはループを一回回すたびにループを中断して元の処理に戻る
            yield return i;
        }
    }
}

引用元はここ
これって要するにyield returnまでの処理で評価して返す。
ただし実際に中断してるわけじゃないのでガチで無限ループってるといっこうに処理が終わらない。 また返却するのは列挙型なので、単純なオブジェクトじゃない。
したがって手動で何度も呼び出しても意味が無い。

Debug.Log(Apple());
Debug.Log(Apple());
// こうやっても帰ってくるのはオブジェクト列挙型
//  1
//  2
// とかにはならない。

これをどうやって非同期処理につなげてくかはまた次回。
寝たい。