次のコードを考えると
for i in range(10):
touchManager.AddButton( {t | _i = i; StartLevel(_i) } )
def StartLevel(level):
print level
_i
変数に値を保持させたいのですi
が、次の反復で上書きされないようにします。どうすればそれを達成できますか?
ドキュメンテーションによると、クロージャーはそのコンテキストに対して「読み取りおよび書き込みアクセス」を持っています。つまり、クロージャーはi
、定義されるたびに値を保存するのではなく、実行されるたびに参照を使用します。
クロージャー内に値を保存する標準的な方法がないかどうかはわかりません-ブー言語のドキュメントは非常に貧弱です。あなたができる最善のことは、何人かの開発者に直接尋ねることです (彼らの何人かは boo google グループで入手できます)。
ただし、呼び出し可能なクラスを明示的に定義することで、いつでも目的の動作を実現できます。
class MyClosure(ICallable):
i as int
def constructor(i as int):
self.i=i;
def Call(o as (object)):
StartLevel(i)
そしてそれを次のように使用します:
for i in range(10):
touchManager.AddButton( MyClosure(i))
このようなクロージャ クラスを自動的に生成するマクロを定義することもできますが、かなり困難です (マクロに関するリンクをいくつか示します)。