From 1dadc701c04879f1df4ddaa0df362297a144d7b3 Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Tue, 25 Feb 2020 20:06:54 -0800 Subject: macros: add assignment form to pin! (#2274) Allows combining assignment to a binding and pinning it. --- tokio/src/macros/pin.rs | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 'tokio/src/macros') diff --git a/tokio/src/macros/pin.rs b/tokio/src/macros/pin.rs index e8511d3f..5b677610 100644 --- a/tokio/src/macros/pin.rs +++ b/tokio/src/macros/pin.rs @@ -97,6 +97,30 @@ /// } /// } /// ``` +/// +/// Because assigning to a variable followed by pinning is common, there is also +/// a variant of the macro that supports doing both in one go. +/// +/// ``` +/// use tokio::{pin, select}; +/// +/// async fn my_async_fn() { +/// // async logic here +/// } +/// +/// #[tokio::main] +/// async fn main() { +/// pin! { +/// let future1 = my_async_fn(); +/// let future2 = my_async_fn(); +/// } +/// +/// select! { +/// _ = &mut future1 => {} +/// _ = &mut future2 => {} +/// } +/// } +/// ``` #[macro_export] macro_rules! pin { ($($x:ident),*) => { $( @@ -108,5 +132,13 @@ macro_rules! pin { let mut $x = unsafe { $crate::macros::support::Pin::new_unchecked(&mut $x) }; - )* } + )* }; + ($( + let $x:ident = $init:expr; + )*) => { + $( + let $x = $init; + crate::pin!($x); + )* + }; } -- cgit v1.2.3