क्या अंतर है `| _ | async चाल {} `और` async चाल | _ | {} `


10

आइए निम्नलिखित उदाहरणों पर विचार करें:

main.rs

use futures::executor::block_on;
use futures::future::{FutureExt, TryFutureExt};


async fn fut1() -> Result<String, u32> {
  Ok("ok".to_string())
}

fn main() {
    println!("Hello, world!");
    match block_on(fut1().and_then(|x| async move { Ok(format!("{} is \"ok\"", x)) })) {
      Ok(s) => println!("{}", s),
      Err(u) => println!("{}", u)
    };
}

Cargo.toml

[dependencies]
futures = "^0.3"

मैं |x| async move {}इसके बजाय अभिव्यक्ति के बारे में पूछ रहा हूं async move |x| {}। उत्तरार्द्ध अधिक स्पष्ट है, लेकिन यह संकलन त्रुटि में चलता है:

error[E0658]: async closures are unstable

तब मैं आश्चर्य है, के बीच अंतर क्या है async move || {}और || async move {}। वे दोनों moveकीवर्ड का उपयोग करने के लिए बंद होने लगते हैं ।

$ rustc --version
rustc 1.39.0 (4560ea788 2019-11-04)

जवाबों:


6

एक async ब्लॉक है (async ब्लॉक के साथ एक क्लोजर उसके शरीर के रूप में सटीक है), जबकि दूसरा async क्लोजर है। प्रति async / प्रतीक्षारत RFC :

async || बंद

कार्यों के अलावा, async को बंद करने के लिए भी लागू किया जा सकता है। एक async फ़ंक्शन की तरह, एक async बंद होने के impl Future<Output = T>बजाय एक वापसी प्रकार होता है T

दूसरी ओर:

async ब्लॉक

आप एक asyncब्लॉक का उपयोग करके सीधे एक अभिव्यक्ति के रूप में भविष्य बना सकते हैं । यह फॉर्म लगभग-आहूत asyncक्लोजर के बराबर है :

 async { /* body */ }

 // is equivalent to

 (async || { /* body */ })()

सिवाय इसके कि नियंत्रण-प्रवाह जैसे निर्माण करता है return, breakऔर continueशरीर के भीतर अनुमति नहीं है।

यहाँ moveखोजशब्द निरूपित करने के लिए है कि async बंद और ब्लॉक उन चर के स्वामित्व पर कब्जा करने के लिए है जिन्हें वे बंद करते हैं।

और स्पष्ट रूप से, async को बंद करना अभी भी अस्थिर माना जाता है। यह इस ट्रैकिंग मुद्दा है


इसलिए अभी इसके आयात में कोई अंतर नहीं है, है ना?
dronte7

@ dronte7 नोप, इस तथ्य के अलावा एक अस्थिर है।
edwardw

वे दोनों तुरंत कुछ चारों ओर चर के अधिग्रहण के बिना ओटी के साथ एक भविष्य में बदल जाते हैं। अस्थिर async को बंद करने के अलावा बाहरी चर के अधिग्रहण के साथ async ब्लॉक के समान है, है ना?
dronte7

@ वे दोनों वापसी एक भविष्य dronte7 जब बुलाया जा रहा है। जहां तक ​​वैरिएबल कैप्चर करने की बात है, वे भी एक जैसे हैं। यही कारण है कि बंद करने के लिए, async या नहीं।
edwardw

2
मुझे लगता है कि चर को पकड़ना दोनों ही मामलों में काफी अलग है। async move || ...वैरिएबल ब्लॉक || async move {...}से क्लोजर में वेरिएबल्स को स्थानांतरित करेगा , जबकि क्लोजर से वेरिएबल को एसिंक्स ब्लॉक में ले जाएगा। यदि आप उन्हें इनक्लोजिंग ब्लॉक से एस्किस ब्लॉक में स्थानांतरित करना चाहते हैं, तो मुझे लगता है कि आपको move || async move {...}अभी के लिए उपयोग करने की आवश्यकता है ।
स्वेन मार्नाच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.