首页 > 解决方案 > 为什么即使泛型类型具有特征绑定,在对泛型类型的引用上也找不到方法?

问题描述

我有一个功能:

fn take_iter<
    LABEL: std::fmt::Debug,
    DATA: std::fmt::Debug,
    SAMPLE: IntoIterator<Item = DATA>,
    I: Iterator<Item = (SAMPLE, LABEL)>,
>(
    iter: I,
) {
    for (sample, label) in iter {
        print!("sample {:.?}: ", label);
        for val in sample {
            print!("{:.?} ", val);
        }
        println!();
    }
}

示例用法:

let a: Vec<(Vec<u8>, u16)> = vec![(vec![1, 2, 3, 4], 2), (vec![1, 2, 3, 4], 4)];
take_iter(a.into_iter());

印刷:

sample 2: 1 2 3 4 
sample 4: 1 2 3 4 

我的目标是调整此函数以通过引用而不是按值获取值:

let a: Vec<(Vec<u8>, u16)> = vec![(vec![1, 2, 3, 4], 2), (vec![1, 2, 3, 4], 4)];
take_iter(a.iter());

我目前的尝试(Rust playground)是:

fn take_iter<
    LABEL: std::fmt::Debug,
    DATA: std::fmt::Debug,
    SAMPLE: IntoIterator<Item = DATA>,
    K: std::ops::Deref<Target = (SAMPLE, LABEL)>,
    I: Iterator<Item = K>,
>(
    iter: I,
) {
    for t in iter {
        let (sample, label) = &*t;
        print!("sample {:.?}: ", label);
        for val in sample.iter() {
            print!("{:.?} ", val);
        }
        println!();
    }
}

这给出了错误:

error[E0599]: no method named `iter` found for reference `&SAMPLE` in the current scope
  --> src/main.rs:30:27
   |
30 |         for val in sample.iter() {
   |                           ^^^^ method not found in `&SAMPLE`

我在这里做错了什么?

标签: genericsrustiterator

解决方案


IntoIteratortrait 只有into_iter()方法,没有iter(). 此外,您必须以拥有的价值而不是参考来称呼它。

在通用代码中,您只能调用函数所需的特征的方法,而不能调用其他任何方法,因此Vec具有.iter().


推荐阅读