Локальные переменные внутри лямбда-блока в Boo

Учитывая следующий код

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

def StartLevel(level):
  print level

Я хотел бы _i переменная для хранения i значение, но не перезаписывается в следующей итерации. Как я могу достичь этого?

1 ответ

Документация говорит, что у замыканий есть "доступ для чтения и записи" к их контексту. Это означает, что ваше закрытие будет использовать ссылку на 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/

Другие вопросы по тегам