Генератор, похоже, не предоставляет метод `resume ()` - PullRequest
0 голосов
/ 08 апреля 2019

Я взглянул на генераторы в Rust и решил попробовать.Я реализовал самый простой пример, который мог найти:

#![feature(generators, generator_trait)]

use std::ops::Generator;

fn main() {
    let mut generator = || {
        println!("2");
        yield;
        println!("4");
    };

    println!("1");
    generator.resume();
    println!("3");
    generator.resume();
    println!("5");
}

Однако, когда я пытаюсь скомпилировать, я получаю эту ошибку:

error[E0599]: no method named `resume` found for type `[generator@src/main.rs:6:25: 10:6 _]` in the current scope
  --> src/main.rs:13:15
   |
13 |     generator.resume();
   |               ^^^^^^

Я делаю что-то не так или resume() метод на самом деле не существует на генераторах?Если так, как я могу разбудить генератор?В документации я смог найти все точки к методу resume(), поэтому сейчас я в замешательстве.

Примечание : Да, я знаю, что это нестабильная функция языка, нов документе он поощряет пользователей к его использованию, поэтому я предполагаю, что он должен быть хотя бы частично реализован?

Моя текущая среда : rustc 1.35.0-nightly (acd8dd6a5 2019-04-05)

1 Ответ

3 голосов
/ 08 апреля 2019

Да, я знаю, что это нестабильная функция

Нестабильные функции имеют тенденцию изменяться со временем, и это так.С недавней стабилизацией Pin подпись resume была изменена ( PR # 55704 )

fn resume(self: Pin<&mut Self>) -> GeneratorState<Self::Yield, Self::Return>;

Но, к счастью, примеры также имеют принято .

Итак, ваш код должен выглядеть следующим образом:

#![feature(generators, generator_trait)]

use std::ops::Generator;
use std::pin::Pin;

fn main() {
    let mut generator = || {
        println!("2");
        yield;
        println!("4");
    };

    let mut pin = Pin::new(&mut generator);
    println!("1");
    pin.as_mut().resume();
    println!("3");
    pin.as_mut().resume();
    println!("5");
}

Преимущество этого в том, что для этого подхода больше не требуется unsafe (чтоваш код отсутствует и, следовательно, не должен компилироваться на более старых ночных версиях), и именно поэтому для генератора был выбран Pin API.

Извлеченные уроки: если вы используете ночной компилятор, также используйте ночные документы .

...