如何通过特征委托具有非静态参数的异步函数?
How to delegate an async function with non-static parameter by a trait?
喜欢这个代码:
use std::future::Future;
use std::pin::Pin;
trait A {
fn handle<'a>(&'a self, data: &'a i32) -> Pin<Box<dyn 'a + Future<Output = ()>>>;
}
impl<'b, Fut> A for fn(&'b i32) -> Fut
where
Fut: 'b + Future<Output = ()>,
{
fn handle<'a>(&'a self, data: &'a i32) -> Pin<Box<dyn 'a + Future<Output = ()>>> {
Box::pin(self(data))
}
}
如何为所有 async fn(&i32)
实施 A
?
此代码应该有效:
use std::future::Future;
use std::pin::Pin;
trait A<'a> {
fn handle(&'a self, data: &'a i32) -> Pin<Box<dyn 'a + Future<Output=()>>>;
}
impl <'a, F, Fut> A<'a> for F
where F: 'static + Fn(&'a i32) -> Fut,
Fut: 'a + Future<Output=()>
{
fn handle(&'a self, data: &'a i32) -> Pin<Box<dyn 'a + Future<Output=()>>> {
Box::pin(self(data))
}
}
然后我们可以使用for<'a> A<'a>
到处委托异步函数。
async fn processor(data: &i32) {
}
fn consume(a: impl for<'a> A<'a>) {
}
fn main() {
consume(processor);
}
喜欢这个代码:
use std::future::Future;
use std::pin::Pin;
trait A {
fn handle<'a>(&'a self, data: &'a i32) -> Pin<Box<dyn 'a + Future<Output = ()>>>;
}
impl<'b, Fut> A for fn(&'b i32) -> Fut
where
Fut: 'b + Future<Output = ()>,
{
fn handle<'a>(&'a self, data: &'a i32) -> Pin<Box<dyn 'a + Future<Output = ()>>> {
Box::pin(self(data))
}
}
如何为所有 async fn(&i32)
实施 A
?
此代码应该有效:
use std::future::Future;
use std::pin::Pin;
trait A<'a> {
fn handle(&'a self, data: &'a i32) -> Pin<Box<dyn 'a + Future<Output=()>>>;
}
impl <'a, F, Fut> A<'a> for F
where F: 'static + Fn(&'a i32) -> Fut,
Fut: 'a + Future<Output=()>
{
fn handle(&'a self, data: &'a i32) -> Pin<Box<dyn 'a + Future<Output=()>>> {
Box::pin(self(data))
}
}
然后我们可以使用for<'a> A<'a>
到处委托异步函数。
async fn processor(data: &i32) {
}
fn consume(a: impl for<'a> A<'a>) {
}
fn main() {
consume(processor);
}