gpt4 book ai didi

rust - 为具有返回生命周期的函数绑定(bind)类型

转载 作者:行者123 更新时间:2023-12-05 05:38:12 25 4
gpt4 key购买 nike

考虑函数

fn f(v: &[usize]) -> impl Iterator<Item = usize> + '_ {
v.iter().cloned()
}

我想编写一个通用函数 g,它接受任何与 f 具有相同签名的函数,并在不同的生命周期内调用该函数。这可能吗?


我的尝试1:我天真地写了

fn g<F>(f: F)
where
F: for<'a> Fn(&'a [usize]) -> (impl Iterator<Item = usize> + 'a) {}

但是我得到了

error[E0562]: `impl Trait` only allowed in function and inherent method return types, not in `Fn` trait return

我的尝试 2:我试图给 g 另一个特定迭代器类型的类型参数:

fn g<F, I>(f: F)
where
I: Iterator<Item = usize>,
F: for<'a> Fn(&'a [usize]) -> I {}

我认为如果迭代器是'static,这会起作用。但在这种情况下,我需要 I 成为具有一个生命周期参数的更高种类的类型。具体来说,这个 g 编译但不接受 f


我的尝试 3:同上,但是给 g 一个生命周期参数来特化 f:

fn g<'a, F, I>(f: F)
where
I: Iterator<Item = usize> + 'a,
F: Fn(&'a [usize]) -> I {}

这会编译并接受f,但是g的主体只能使用具有特定生命周期的f 'a.

最佳答案

正如 Sven Marnach 所指出的,它可以通过 Box 指针来完成。

fn f(v: &[usize]) -> Box<dyn Iterator<Item = usize> + '_> {
Box::new(v.iter().cloned())
}

fn g<F>(f: F)
where
F: Fn(&[usize]) -> Box<dyn Iterator<Item = usize> + '_>
{
let v = vec![1, 2, 3];
{
let iter = f(&v);
for i in iter {
println!("{}", i);
}
}
}

fn main() {
g(f)
}

关于rust - 为具有返回生命周期的函数绑定(bind)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72977297/

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