Локальные переменные внутри лямбда-блока в 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))
Вы также можете попытаться определить макрос, который будет автоматически генерировать такие классы замыкания, но это будет довольно сложно (вот несколько ссылок относительно макросов):