`| _ | এর মধ্যে পার্থক্য কী 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 || বন্ধ

ফাংশনগুলির পাশাপাশি, অ্যাসিঙ্কটি ক্লোজারগুলিতেও প্রয়োগ করা যেতে পারে। একটি অ্যাসিঙ্ক ফাংশনের মতো, অ্যাসিঙ্ক ক্লোজারের impl Future<Output = T>পরিবর্তে রিটার্নের ধরণের থাকে T

অন্য দিকে:

async ব্লক

আপনি একটি asyncব্লক ব্যবহার করে সরাসরি ভাব প্রকাশ হিসাবে ভবিষ্যত তৈরি করতে পারেন । এই ফর্মটি তাত্ক্ষণিকভাবে অনুরোধ করা asyncবন্ধের সমান :

 async { /* body */ }

 // is equivalent to

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

ছাড়া মতো কন্ট্রোল- প্রবাহ নির্মান return, breakএবং continueশরীরের মধ্যে অনুমোদিত নয়।

এখানে moveকীওয়ার্ডটি বোঝানো হচ্ছে যে অ্যাসিঙ্ক ক্লোজার এবং ব্লক হ'ল তারা বন্ধ হওয়া ভেরিয়েবলগুলির মালিকানা অর্জন করবে।

এবং দৃশ্যত, অ্যাসিঙ্ক বন্ধ এখনও অস্থির বলে মনে করা হয়। এটা আছে এই ট্র্যাকিং ইস্যু


এখনই এর আমদানিতে কোনও পার্থক্য নেই, তাই না?
dronte7

@ dronte7 না, সত্যটি বাদ দিয়ে একটি অস্থির।
এডওয়ার্ডউ

তারা উভয়ই কিছু আশেপাশের ভেরিয়েবলগুলি অর্জন না করেই তাত্ক্ষণিকভাবে ওটি দিয়ে ভবিষ্যতে পরিণত হয়। অস্থির অ্যাসিঙ্ক বন্ধ হওয়া ছাড়া বাহ্যিক ভেরিয়েবলগুলি অর্জনের সাথে অ্যাসিঙ্ক ব্লকের মতোই, তাই না?
dronte7

@ dronte7 যখন ডাকা হবে তখন তারা দুজনেই ভবিষ্যতের ফিরিয়ে দেয় । ভেরিয়েবল ক্যাপচার হিসাবে, তারা একই রকম they এটিই ক্লোজারকে বোঝায়, অ্যাসিঙ্ক বা না।
এডওয়ার্ডউ

2
আমি মনে করি উভয় ক্ষেত্রেই ভেরিয়েবল ক্যাপচার করা বেশ আলাদা is async move || ...আসন্ন ব্লক || async move {...}থেকে ভেরিয়েবলগুলি বন্ধের মধ্যে স্থানান্তরিত করবে , যখন বন্ধটি থেকে ভেরিয়েবলগুলি অ্যাসিঙ্ক ব্লকে স্থানান্তরিত করবে। যদি আপনি এগুলি এনকোলেজিং ব্লক থেকে অ্যাসিঙ্ক ব্লকে স্থানান্তর করতে চান তবে আমি মনে করি আপনার move || async move {...}আপাতত ব্যবহার করা দরকার ।
সোভেন মারনাচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.