繁体   English   中英

对于必须实现“iter”函数的类型,我应该使用哪个特征绑定

[英]Which trait bound should I use for a type that must implement the "iter" function

我正在尝试实现一个由泛型字段组成的结构,该类型必须实现非消耗的“iter”方法(见下文)。

struct Node<T> {
    key: T
}

impl<T> Node<T> where T: ?? {
    fn do_stuff(&self) {
        for e in self.key.iter() {
            /* ... */
        }
    }
}

fn main() {
    let n1 = Node { key: "foo".to_owned() };
    n1.do_stuff();
    
    let n2 = Node { key: vec![1, 2, 3] };
    n2.do_stuff();
}

我应该将哪个特征边界与参数T相关联?

您正在寻找的 trait bound 是&T: IntoIterator 作为惯例,提供非消费iter()还提供IntoIterator实现以引用该类型。 (同样, iter_mut()等价于&mut T IntoIterator 。)

例如:

impl<T> Node<T>
where
    for<'a> &'a T: IntoIterator,
{
    fn do_stuff(&self) {
        for e in &self.key { /* ... */ }
    }
}

但是请注意,这不会使用key: "foo".to_owned()编译,因为String不可迭代。

我应该将哪个特征边界与参数T相关联?

标准库中没有这样的特征, iter()是一个固有的方法——它不是来自特征实现。 当然,您可以创建自己的特征(例如, Iter )来指定iter()

如果您正在使用泛型类型并需要确保此类类型的值可以转换为迭代器,您可能需要考虑将类型IntoIteratorIntoIterator特征。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM