首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >作为函数参数的IntoIterator不接受适配器结构

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

Stack Overflow用户
提问于 2019-09-29 20:14:11
回答 1查看 1.2K关注 0票数 3

我希望有一个接受&IntoIterator<Item=u32>的函数,这样我就可以同时传递&Vec<u32>和迭代器的适配器结构(比如MapFilter和其他任何我认为都实现了IntoIterator)。

所以我有个功能

代码语言:javascript
复制
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
}

这就是我如何尝试使用它(相同的签名,但不同的名称)

代码语言:javascript
复制
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)
}

我得到的是一个错误

代码语言:javascript
复制
 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中是惯用的。如何处理这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-29 20:33:54

我认为您希望在T (而不是&'a T)上有特性限制。所以我想你真的想要以下几点:

代码语言:javascript
复制
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,就不能调用it_src.into_iter

因此,如果您真的想使用into_iter,可以尝试如下:

代码语言:javascript
复制
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进行转换),就可以得到简单、直接的解决方案:

代码语言:javascript
复制
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)
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58158841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档