无法同时多次借用`*x`作为可变引用

3
请看一下我的代码,并建议可能的修复方案:
use std::future::Future;

pub async fn bar() {
    let mut x = 0u8;
    foo(&mut x, |x| baz(x)).await;
}

pub async fn baz(x: &mut u8) {
    *x += 1;
}

pub async fn foo<'a, F, T>(x: &'a mut u8, f: F)
where
    F: Fn(&'a mut u8) -> T,
    T: Future<Output = ()> + 'a,
{
    loop {
        f(x).await;
    }
}

为什么在 await 后,x 仍然是被借用状态?有什么适当的解决方法吗?


1
您的问题与异步编程完全无关。此处提供了仅包含有问题代码部分的精简版本。 - jthulhu
2
你的版本和我的主要区别在于,在后者中,你不能仅仅通过删除生命周期来使其工作。 - ababo
你需要在这里使用HRTB,但是生命周期适用于两种通用类型。我认为这种语言目前没有表达的方式。 - cdhowie
我们能用非泛型的future(例如Pin<Box<dyn Future>>)来表达吗? - ababo
1个回答

0

看起来我已经找到了解决非泛型 future 类型问题的方法:

use std::future::Future;
use std::pin::Pin;

pub type BoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + 'a>>;

pub async fn bar() {
    let mut x = 0u8;
    foo(&mut x, baz).await;
}

pub fn baz(x: &mut u8) -> BoxFuture<()> {
    Box::pin(async move {
        baz2(x).await
    })
}

pub async fn baz2(x: &mut u8) {
    *x += 1;
}

pub async fn foo<F>(x: &mut u8, f: F)
where
    F: Fn(&mut u8) -> BoxFuture<()>,
{
    loop {
        f(x).await;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接