我希望有一个接受&IntoIterator<Item=u32>的函数,这样我就可以同时传递&Vec<u32>和迭代器的适配器结构(比如Map、Filter和其他任何我认为都实现了IntoIterator)。
所以我有个功能
pub fn f<'a, T>(it_src: &'a T) -> u32
where &'a T: IntoIterator<Item = u32> {
let it = it_src.into_iter();
let result: u32;
// more more usage
result
}这就是我如何尝试使用它(相同的签名,但不同的名称)
pub fn f_with_feature()<'a, T>(it_src: &'a T) -> u32
where &'a T: IntoIterator<Item = u32> {
let adjusted_values = it_src.into_iter()
.map(|e| adjust(e));
f(&adjusted_values)
}我得到的是一个错误
error[E0308]: mismatched types
--> src\main.rs:14:7
|
14 | f(&adjusted_values)
| ^^^^^^^^^^^^^^^^ expected type parameter, found struct `std::iter::Map`
|
= note: expected type `&T`
found type `&std::iter::Map<<&T as std::iter::IntoIterator>::IntoIter, [closure@src\main.rs:13:14: 13:27]>`为什么地图与T不匹配?
另外,我想出了一个想法,通过静态分派传递迭代器的适配器不是一个好主意,因为用于生成Map的彼此闭包将创建一个新的函数专门化。尽管我在大多数情况下都看到了静态调度方法在Rust中是惯用的。如何处理这种情况?
发布于 2019-09-29 20:33:54
我认为您希望在T (而不是&'a T)上有特性限制。所以我想你真的想要以下几点:
pub fn f<'a, T>(it_src: &'a T) -> u32
where T: IntoIterator<Item = u32> {
let it = it_src.into_iter();
let result: u32 = 1;
// more more usage
result
}
pub fn f_with_feature<'a, T>(it_src: &'a T) -> u32
where T: IntoIterator<Item = u32> {
let adjusted_values = it_src.into_iter()
.map(|e| adjust(e));
f(&adjusted_values)
}这就引出了下一个问题:IntoIterator的into_iter消费self,这意味着如果只借用it_src,就不能调用it_src.into_iter。
因此,如果您真的想使用into_iter,可以尝试如下:
pub fn f<T>(it_src: T) -> u32
where T: IntoIterator<Item = u32> {
let it = it_src.into_iter();
let result: u32 = 1;
// more more usage
result
}
pub fn f_with_feature<T>(it_src: T) -> u32
where T: IntoIterator<Item = u32> {
let adjusted_values = it_src.into_iter()
.map(|e| adjust(e));
f(adjusted_values)
}然而,以上所述要求您将这些值移到f resp中。f_with_feature。
根据我的经验,只需使用迭代器(必要时在call site进行转换),就可以得到简单、直接的解决方案:
pub fn f<T>(it_src: T) -> u32
where T: Iterator<Item = u32> {
let it = it_src.into_iter();
let result: u32 = 1;
// more more usage
result
}
pub fn f_with_feature<T>(it_src: T) -> u32
where T: Iterator<Item = u32> {
let adjusted_values = it_src.into_iter()
.map(|e| adjust(e));
f(adjusted_values)
}https://stackoverflow.com/questions/58158841
复制相似问题