Как клонировать генератор? - PullRequest
2 голосов
/ 20 июня 2019

Можно ли клонировать переменную типа std::ops::Generator? Есть генератор, я хочу создать новый экземпляр, с чистым стеком, метода clone() нет. Я пробовал внутри Box и внутри Pin, но он не клонируется!

#![feature(generators, generator_trait)]

fn main() {
    let gen = move || yield ();

    let gen1 = gen.clone();

    let gen = Box::new(move || yield ());
    let gen1 = gen.clone();

    let gen = Box::pin(move || yield ());
    let gen1 = gen.clone();
}
error[E0599]: no method named `clone` found for type `[generator@src/main.rs:4:15: 4:31 _]` in the current scope
 --> src/main.rs:6:20
  |
6 |     let gen1 = gen.clone();
  |                    ^^^^^

Насколько я понимаю, замыкания могут быть клонированы; что не так с генераторами?

Единственный найденный мной обходной путь - вернуть генератор из какой-то функции (тогда он будет каждый раз новым), но это синтаксически неудобно для меня.

1 Ответ

2 голосов
/ 20 июня 2019

Нет, невозможно клонировать генератор .

Текущий обходной путь - создание нового генератора каждый раз, когда вам нужно его сбросить.

переменная типа std::ops::Generator

Это не переменные этого типа, более чем || foo() является переменной типа Fn(). Generator - это черта , а dyn Generator - это тип . Ваши gen переменные являются анонимными типами, которые реализуют признак Generator.

Смотри также:

...