mirror of
https://github.com/rust-lang/rust.git
synced 2025-11-02 05:55:42 +00:00
We had a discussion[1] today about whether postfix yield would make sense. It's easy enough to support both in the parser, so we might as well have both and see how people use it while the feature is experimental. [1]: https://rust-lang.zulipchat.com/#narrow/channel/481571-t-lang.2Fgen/topic/postfix-yield/with/505231568
35 lines
911 B
Rust
35 lines
911 B
Rust
// This demonstrates a proposed alternate or additional option of having yield in postfix position.
|
|
|
|
//@ run-pass
|
|
//@ edition: 2024
|
|
|
|
#![feature(gen_blocks, coroutines, coroutine_trait, yield_expr)]
|
|
|
|
use std::ops::{Coroutine, CoroutineState};
|
|
use std::pin::pin;
|
|
|
|
fn main() {
|
|
// generators (i.e. yield doesn't return anything useful)
|
|
let mut gn = gen {
|
|
yield 1;
|
|
2.yield;
|
|
};
|
|
|
|
assert_eq!(gn.next(), Some(1));
|
|
assert_eq!(gn.next(), Some(2));
|
|
assert_eq!(gn.next(), None);
|
|
|
|
//coroutines (i.e. yield returns something useful)
|
|
let mut coro = pin!(
|
|
#[coroutine]
|
|
|_: i32| {
|
|
let x = yield 1;
|
|
yield x + 2;
|
|
}
|
|
);
|
|
|
|
assert_eq!(coro.as_mut().resume(0), CoroutineState::Yielded(1));
|
|
assert_eq!(coro.as_mut().resume(2), CoroutineState::Yielded(4));
|
|
assert_eq!(coro.as_mut().resume(3), CoroutineState::Complete(()));
|
|
}
|