我想要一个可以接受&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中是惯用的。如何处理这种情况?
答案 0 :(得分:1)
我认为您想对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
的{{1}}消耗了into_iter
,这意味着如果您仅借用self
就无法致电it_src.into_iter
因此,如果您真的想使用it_src
,可以尝试以下操作:
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
。
以我的经验,只需进行迭代(并在必要时在调用站点进行转换),便会得出简单,直接的解决方案:
f_with_feature