আমি কীভাবে মরিচায় একটি অ্যাসিঙ্ক ফাংশনটি ম্যাপে রাখতে পারি?


11

অ্যাসিঙ্ক রাউটারের জন্য লেখার সময় আমি অ্যাসিঙ্ক ফাংশনগুলি পরিচালনা করতে পারি না hyper

এই কোড:

use std::collections::HashMap;
use std::future::Future;

type BoxedResult<T> = Result<T, Box<dyn std::error::Error + Send + Sync>>;
type CalcFn = Box<dyn Fn(i32, i32) -> dyn Future<Output = BoxedResult<i32>>>;

async fn add(a: i32, b: i32) -> BoxedResult<i32> {
    Ok(a + b)
}

async fn sub(a: i32, b: i32) -> BoxedResult<i32> {
    Ok(a - b)
}

fn main() {
    let mut map: HashMap<&str, CalcFn> = Default::default();
    map.insert("add", Box::new(add));
    map.insert("sub", Box::new(sub));

    println!("map size: {}", map.len());
}

নিম্নলিখিত সংকলক ত্রুটি উত্পন্ন করে:

error[E0271]: type mismatch resolving `<fn(i32, i32) -> impl std::future::Future {add} as std::ops::FnOnce<(i32, i32)>>::Output == dyn std::future::Future<Output = std::result::Result<i32, std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>>>`
  --> src/main.rs:17:23
   |
17 |     map.insert("add", Box::new(add));
   |                       ^^^^^^^^^^^^^ expected opaque type, found trait std::future::Future
   |
   = note: expected type `impl std::future::Future`
              found type `dyn std::future::Future<Output = std::result::Result<i32, std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>>>`
   = note: required for the cast to the object type `dyn std::ops::Fn(i32, i32) -> dyn std::future::Future<Output = std::result::Result<i32, std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>>>`

error[E0271]: type mismatch resolving `<fn(i32, i32) -> impl std::future::Future {sub} as std::ops::FnOnce<(i32, i32)>>::Output == dyn std::future::Future<Output = std::result::Result<i32, std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>>>`
  --> src/main.rs:18:23
   |
18 |     map.insert("sub", Box::new(sub));
   |                       ^^^^^^^^^^^^^ expected opaque type, found trait std::future::Future
   |
   = note: expected type `impl std::future::Future`
              found type `dyn std::future::Future<Output = std::result::Result<i32, std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>>>`
   = note: required for the cast to the object type `dyn std::ops::Fn(i32, i32) -> dyn std::future::Future<Output = std::result::Result<i32, std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>>>`

দেখে মনে হচ্ছে impl Futureএবং এর মধ্যে দ্বন্দ্ব রয়েছে dyn Future, তবে কীভাবে এটি পরিচালনা করব আমার কোনও ধারণা নেই।

উত্তর:


5

এটি ঘটে কারণ impl Futureএটি একটি কংক্রিটের অনন্য প্রকারের এবং dyn Futureএকটি বিমূর্ত প্রকারের। HashMapবিমূর্ত প্রকারটি প্রত্যাশা করে যেহেতু এটি কেবলমাত্র একক ধরণের দৃষ্টান্ত রাখতে পারে।

যদি আমরা অ্যাসিঙ্ক ফাংশনগুলির রিটার্নের ধরণের বাক্সটি বাক্স করতে পারি তবে আমরা এই ফিউচারগুলিকে একটিতে যুক্ত করতে সক্ষম হব HashMap

প্রথমে আমাদের ধরণের পরিবর্তন করতে হবে CalcFn:

type CalcFn = Box<dyn Fn(i32, i32) -> Pin<Box<dyn Future<Output = i32>>>>;

তাহলে এটি কৌশলটি করতে পারে:

let mut map: HashMap<&str, CalcFn> = Default::default();
map.insert("add", Box::new(|a, b| Box::pin(add(a, b))));
map.insert("sub", Box::new(|a, b| Box::pin(sub(a, b))));

println!("map size: {}", map.len());

//map.get("add").unwrap()(2, 3).await

এই সম্পূর্ণ উদাহরণটি সরলকরণের ধরণের, Futureএর পরিবর্তে Itemএকটি ব্যবহার করে । আপনার কেসের জন্য সম্পূর্ণ কোডও চেক করুন ।i32Result


নির্বাহকের সাথে পুরো উদাহরণ
Emer Erden

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.