gpt4 book ai didi

rust - 如何实现返回带有生命周期参数的引用的 FnMut?

转载 作者:行者123 更新时间:2023-11-29 08:01:09 26 4
gpt4 key购买 nike

我有第三方库,代码如下:

pub struct Foo<T> { t: T }

impl<'a, T> Foo<T> where T: 'a + FnMut() -> &'a [u8] {
pub fn from_callback(closure: T) -> Self {
Foo { t: closure }
}
}

闭包效果很好:

let buffer = vec![0; 100];
Foo::from_callback(move || &buffer)

但是我想从我的函数中返回 Foo。因此我不能使用闭包,所以我决定使用自己的结构来实现 FnMut

我已经定义了结构:

pub struct Func {
buffer: Vec<u8>,
}

然后为它实现FnMut:

#![feature(unboxed_closures)]

impl FnMut<()> for Func {
extern "rust-call" fn call_mut(&mut self, _: ()) -> Self::Output {
&self.buffer
}
}

然后需要实现 FnOnce:

impl FnOnce<()> for Func {
type Output = &[u8];
^~~~ error: missing lifetime specifier [E0106]
extern "rust-call" fn call_once(self, _: ()) -> Self::Output {
unimplemented!();
}
}

但我不知道在 Output 中使用什么作为生命周期的引用。

最佳答案

@马修姆。是正确的。如果没有更高级的类型,这是无法完成的,即使它们可用,我也不完全确定是否可以更改 Fn* traits 以支持它。

问题是,您希望您的函数在此函数内部返回向量的一部分。但是,这需要 call_mut() 具有以下签名:

fn call_mut<'a>(&'a mut self, _: ()) -> Self::Output<'a>

lifetime 参数是必需的,因为它是指定函数调用结果与函数本身一样长的唯一方法。这又需要 Output 关联类型具有生命周期参数:

trait FnOnce<A> {
type Output<'a>;
...
}

这正是 HKT 所允许的。但是,我不确定是否可以将 HKT 用于函数。请记住,每个 FnMut 也是 FnOnce:如果您有一个可以多次调用的函数,那么它也可以被调用一次。当然,FnMutFnOnce 的结果应该是等价的。但是,无法从 FnOnce 返回借用的数据,因为它采用函数按值。在您的情况下,向量将移动到函数,并且由于函数返回一个切片而不是向量,它将无处可去,因此将被销毁。因此,此类更改需要允许某些函数为 FnMut/Fn 而不是 FnOnce;我不确定这是否可取甚至可能。

关于rust - 如何实现返回带有生命周期参数的引用的 FnMut?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32219798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com