Вопрос

Я экспериментирую с закрытиями:

fn call_it(f: ||) {
    f(); 
}
let klosure = || println("closure!");
call_it(klosure);
call_it(klosure); //Blows up here
.

Передача klbiz в call_it () Дважды вызывает ошибку компилятора, начисляю по количеству замыкающего значения:

closures.rs:16:13: 16:20 error: use of moved value: `klosure`
closures.rs:16     call_it(klosure);
                           ^~~~~~~
closures.rs:15:13: 15:20 note: `closure` moved here because it has type `||`, which is a non-copyable stack closure (capture it in a new closure, e.g. `|x| f(x)`, to override)
closures.rs:15     call_it(klosure);
                           ^~~~~~~
.

Компилятор на самом деле делает предложение о том, как разрешить проблему, но я не понял, как это успешно применить его.

Любые предложения?: D

Это было полезно?

Решение

Примечание: «Закрытие» перемещена здесь, потому что он имеет тип `||`, который является не копированным закрытием стека (захват его в новом закрытии, например, `| x | f (x)`, для переопределения) .

Это означает, что вы будете писать || closure() вместо closure: вы проходите в новом закрытии, который вызывает ваше первое закрытие.

Другие советы

(Обновление: не делайте этого, это может быть запрещено в ближайшем будущем. Генеракодицетагкод, вероятно, будет работать хорошо сейчас и в будущем. См. Обсуждение и ссылки в комментариях к этому ответу.)

Другой потенциальный подход (хотя немного уродливой для чтения):

fn call_it(f_ref: &||) { // now takes a borrowed reference to a closure
    (*f_ref)();
}
let klosure = || println("closure!");
call_it(&klosure);
call_it(&klosure);
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top