macro_rules! async_hn_once {
($($clmv:ident,)* |_| $body:expr) => { ... };
($($clmv:ident,)* |$args:ident| $body:expr) => { ... };
($($clmv:ident,)* |$args:ident : & $Args:ty| $body:expr) => { ... };
}Expand description
Declare an async clone-move event handler that is only called once.
The macro input is a closure with optional clone-move variables, internally it uses clmv! so
the input is the same syntax.
§Examples
The example captures data by move and then moves it again to another thread. This is not something you can do using async_hn!
because that handler expects to be called many times. We expect on_open to only be called once, so we can don’t need to capture by
clone-move here just to use data.
let data = vec![1, 2, 3];
on_open = async_hn_once!(|_| {
task::run(async move {
for i in data {
print!("{i}, ");
}
})
.await;
println!("Done!");
});You can still clone-move to have access to the variable after creating the handler, in this case the data will be cloned into the handler
but will just be moved to the other thread, avoiding a needless clone.
let data = vec![1, 2, 3];
on_open = async_hn_once!(data, |_| {
task::run(async move {
for i in data {
print!("{i}, ");
}
})
.await;
println!("Done!");
});
println!("{data:?}");