万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

Boo Language Advent Calendar 2012 21日目 Title:「関数の受け渡し」

URL: http://atnd.org/events/34622

関数の引渡しがUnityScriptは楽だったが、Booではどうやるか調べた。
僕はUnityScriptが嫌いですが皮肉にもUnityScriptについては当ブログが情報量多いし一番わかり易いですねw(自画自賛乙)

参考にした
URL: http://stackoverflow.com/questions/275704/lambdas-in-boo

ではMain Cameraにアタッチする2つのスクリプト書いてみたよ。
※ちなみに今後はautopep8で整形して、クラス名と(の間のスペースをきちんと取り除いてからBooコード載せます。

・FuncTestSender.boo (以後センダーと呼ばせて)
こっちが関数送るよ

import UnityEngine


class FuncTestSender(MonoBehaviour):

    def Start():
        rcvr = GetComponent[of FuncTestReciever]()
        rcvr.Func = {x | Debug.Log(x + 2)}

    def Update():
        pass

・FuncTestReciever.boo (以後レシーバと呼ばせて)
※こっちが関数を_func変数で受けるよ

import UnityEngine


class FuncTestReciever(MonoBehaviour):

    [Property(Func)]
    private _func as callable(int)

    def Update():
        if(_func):
            _func(1)

UnitySctiptの方が読みやすいかもしれないが、それは慣れていないだけと信じたい。

解説すると、センダーの↓はxという引数をもらって、Debug.Log(x + 2)という結果を返すよってこと。

{x | Debug.Log(x + 2)}

レシーバの

_func as callable(int)

で、「引数が"int'で、返り値"void"の関数」を変数として使えるってこと。

しかし、↓の書き方も許容した(@_@;)

_func as callable(int) as string

↓これが実際の関数の実行部分です。引数1を受け取りますってことです。

        if(_func):
            _func(1)

分かりましたでしょうか?
分からなかったらコメントとかTwitterで聞けば説明します。

では次の方!