【问题标题】:Understanding Generic FromIterator in Rust理解 Rust 中的泛型 FromIterator
【发布时间】:2020-05-12 09:20:59
【问题描述】:
我是 Rust 新手,我发现自己迷失在第二行。我该如何解释它?哪一个是我可以用来转换为SimpleLinkedList 的交互器?
impl<T> FromIterator<T> for SimpleLinkedList<T> {
fn from_iter<I: IntoIterator<Item = T>>(_iter: I) -> Self {
unimplemented!()
}
}
【问题讨论】:
标签:
generics
rust
linked-list
iterator
traits
【解决方案1】:
我发现自己迷失在第二行。我该如何解释它?
什么部分? from_iter 被定义为在类型 I 上参数化的泛型函数。然后该类型被限制在(意味着它必须实现)IntoIterator<Item=T>。
IntoIterator<Item=T> 表示可以迭代该类型(转换为Iterator)并产生T。用其他语言的术语来说,它是 Ts 的一个迭代ble。
所以from_iter 是一个通用函数,其输入是SimpleLinkedList 应包含的任何项目的迭代ble (IntoIterator)。
谁会是互动者
_iter.into_iter() 将是输入迭代器。您也可以使用 for 循环对 _iter 进行迭代,因为它使用 IntoIterator trait 隐式地将其 RHS 转换为迭代器。
【解决方案2】:
一开始看起来很吓人,但实现起来非常简单。
impl<T> FromIterator<T> for SimpleLinkedList<T> {
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
let mut list = SimpleLinkedList::new();
for item in iter {
list.push(item);
}
list
}
}
要知道的关键是实现特征IntoIterator 的类型可以在for-in 循环中使用。 Item = T 仅表示迭代器返回 T 类型的项目。您只需遍历 iter 并将项目推送到您的 SimpleLinkedList 结构中即可进行转换。