我想要一个可以接受&IntoIterator<Item=u32>的函数,因此我可以将&Vec<u32>和迭代器的适配器结构(例如MapFilter和其他任何我都实现了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]>`

Map与T不匹配怎么办?

另外,我想出了一个主意,即通过静态分配传递迭代器的适配器不是一个好主意,因为用于生成Map的每个其他闭包都会创建新的函数专门化。尽管我已经看到大多数时候静态分配方法在Rust中是惯用的。如何处理这种情况?

最佳答案

我认为您想在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)
}

这就引出了下一个问题:IntoIteratorinto_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 resp中。 f_with_feature

以我的经验,仅使用一个迭代器(并在必要时在调用站点进行转换)会导致简单,直接的解决方案:
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)
}

关于rust - IntoIterator作为函数参数不接受适配器结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58158841/

10-11 23:08