1

次のコードを考えると

for i in range(10):
  touchManager.AddButton( {t | _i = i; StartLevel(_i) } )

def StartLevel(level):
  print level

_i変数に値を保持させたいのですiが、次の反復で上書きされないようにします。どうすればそれを達成できますか?

4

1 に答える 1

0

ドキュメンテーションによると、クロージャーはそのコンテキストに対して「読み取りおよび書き込みアクセス」を持っています。つまり、クロージャーは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))

このようなクロージャ クラスを自動的に生成するマクロを定義することもできますが、かなり困難です (マクロに関するリンクをいくつか示します)。

http://boo.codehaus.org/Syntactic+Macros

https://groups.google.com/forum/#!topic/boolang/9wDEevRUHH8

于 2013-11-11T08:40:00.930 に答える