Rust 存储来自Fn闭包的返回值

Rust 存储来自Fn闭包的返回值,rust,Rust,如果将&dyn-Fn(&mut[u8])更改为&dyn-FnOnce(&mut[u8]),则以下代码有效,因为这样可以安全地移动f。然而,我真的不能一次成功,因为我发现了一些问题Fn将起作用 但是,我确实需要捕获结果r,并在consume中返回它,如下所示 use std::sync::Arc; pub type OnVirtualTunWrite = Arc<dyn Fn(&dyn Fn(&mut [u8]) , usize) -> Result<(), (

如果将
&dyn-Fn(&mut[u8])
更改为
&dyn-FnOnce(&mut[u8])
,则以下代码有效,因为这样可以安全地移动
f
。然而,我真的不能一次成功,因为我发现了一些问题<代码>Fn将起作用

但是,我确实需要捕获结果
r
,并在
consume
中返回它,如下所示

use std::sync::Arc;

pub type OnVirtualTunWrite = Arc<dyn Fn(&dyn Fn(&mut [u8]) , usize) -> Result<(), ()> + Send + Sync>;

struct A {
    on_virtual_tun_write: OnVirtualTunWrite
}

impl A {
    fn consume<R, F>(self, len: usize, f: F) -> Result<R,()>
    where
        F: FnOnce(&mut [u8]) ->  Result<R,()>,
    {
        let mut r: Option<Result<R,()>> = None;
        let result = (self.on_virtual_tun_write)(&|b: &mut [u8]| {
            r = Some(f(b));
        }, len);
        r.unwrap()
    }
}
使用std::sync::Arc;
发布类型OnVirtualUnwrite=弧结果+发送+同步>;
结构A{
在虚拟上写:OnVirtualUnwrite
}
暗示{
fn消费(自我,len:usize,f:f)->结果
哪里
F:FnOnce(&mut[u8])->结果,
{
让mut r:Option=None;
让结果=(self.on_virtual_tun_write)(&b:&mut[u8]|{
r=一些(f(b));
},len);
r、 展开
}
}

我知道要使它
Box编译需要两个更改。一种是将
consume()
函数定义中的
F:Fn一次(&mut[u8])…
更改为
F:Fn(&mut[u8])…
FnOnce()类型的闭包在调用时会消耗自身,因此只能调用一次

更改此选项将导致另一个错误,
r
无法分配到闭包内部。这是因为
r
是闭包外部的捕获变量,Fn()类型将不可变地借用捕获的变量。通过将第二个Fn()更改为FnMut(),
r
变量将被捕获为可变引用,因此可以从闭包内部分配给:

Arc<dyn Fn(&dyn FnMut(&mut [u8]) , usize) -> Result<(), ()> + Send + Sync>
Arc结果+发送+同步>

上一个(和类似)问题的第二部分不包括这一点吗?很遗憾,我无法编辑
消费
功能如果您不能更改消费功能,您可以更改什么?由于consume函数将使用作为self传递给它的结构A对象,因此只能调用\u virtual\u tun\u write
中的闭包一次,因此使用FnOnce(&mut[u8])应该是ok的。cosume()。这里的问题一定在于你是如何使用这个函数的,所以我们需要更多地了解你试图在一个层次上做什么。您可能需要在调用consume之前克隆struct对象,还需要克隆作为f传递给它的FnOnce()闭包,或者最好以完全不同的方式进行操作,dependingI可以完全更改
onVirtualUnwite
,但是我正在避免动态分配,所以我不能在其参数上使用
Box
。我们需要更多关于您试图实现的目标的信息来帮助您。您能否给出创建和调用A struct和consumer函数的代码,并告诉我们您试图用这些代码实现什么?