I stumbled across an example with static || { }
in docs which works. Yet an attempt to use such an expression in my own code fails. I wonder why.
the very example from https://doc.rust-lang.org/stable/std/pin/macro.pin.html
#![feature(generators, generator_trait)]
use std::{
ops::{Generator, GeneratorState},
pin::pin,
};
fn generator_fn() -> impl Generator<Yield = usize, Return = ()> /* not Unpin */ {
// Allow generator to be self-referential (not `Unpin`)
// vvvvvv so that locals can cross yield points.
static || {
let foo = String::from("foo");
let foo_ref = &foo; // ------+
yield 0; // | <- crosses yield point!
println!("{foo_ref}"); // <--+
yield foo.len();
}
}
fn main() {
let mut generator = pin!(generator_fn());
match generator.as_mut().resume(()) {
GeneratorState::Yielded(0) => {},
_ => unreachable!(),
}
match generator.as_mut().resume(()) {
GeneratorState::Yielded(3) => {},
_ => unreachable!(),
}
match generator.resume(()) {
GeneratorState::Yielded(_) => unreachable!(),
GeneratorState::Complete(()) => {},
}
}
my attempt which fails:
fn func() -> impl Fn() {
static || {
println!("qwerty");
}
}
with the following error:
error[E0697]: closures cannot be static
--> ./ex_099.rs:2:5
|
2 | static || {
| ^^^^^^^^^
rust version:
$ rustc --version
rustc 1.70.0-nightly (88fb1b922 2023-04-10)