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 语言文档非常差。您可以做的最好的事情是直接询问一些开发人员(其中一些在 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 回答