考虑功能
fn f(v: &[usize]) -> impl Iterator<Item = usize> + '_ {
v.iter().cloned()
}
我想编写一个泛型函数g
,它接受与f
具有相同签名的任何函数,并用不同的生命周期调用该函数.这可能吗?
My attempt 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
My attempt 2:我try 为特定迭代器类型提供g
个其他类型参数:
fn g<F, I>(f: F)
where
I: Iterator<Item = usize>,
F: for<'a> Fn(&'a [usize]) -> I {}
我认为,如果迭代器是'static
,这将起作用.但在这种情况下,我需要I
是一种更高类型的类型,具有一个生存期参数.具体来说,这g
编译,但不接受f
.
My attempt 3:如上所述,但给g
一个生存期参数来专门化f
:
fn g<'a, F, I>(f: F)
where
I: Iterator<Item = usize> + 'a,
F: Fn(&'a [usize]) -> I {}
这编译并接受f
,但g
的主体只能使用具有特定生存期'a
的f
.