IntoIterator作为函数参数不接受适配器结构

问题描述 投票:1回答:1

我想有一个接受&IntoIterator<Item=u32>的函数,所以我可以将&Vec<u32>和迭代器的适配器结构(例如MapFilter和其他任何我都实现了[C0 ])

所以我有一个类似的功能

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)
}

地图与T不匹配怎么办?

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

rust iterator
1个回答
1
投票

我认为您想在 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上)具有特征范围。因此,我想您实际上需要以下内容:

&'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.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
© www.soinside.com 2019 - 2024. All rights reserved.