Rust语言学习再理解

发布时间 2023-08-24 10:51:53作者: 有翅膀的大象

利用ChatGPT辅助学习,对初学者懂其晦涩语法很方便

use std::iter::IntoIterator;

struct MyStruct {
  data: Vec<u32>
}

impl MyStruct {
  // This has the same name as `std::iter::FromIterator::from_iter`
  fn from_iter(iter: impl IntoIterator<Item = u32>) -> Self {
    Self {
      data: iter.into_iter().collect()
    }
  }
}

impl std::iter::FromIterator<u32> for MyStruct {
    fn from_iter<I: IntoIterator<Item = u32>>(iter: I) -> Self {
      Self {
        data: iter.into_iter().collect()
      }
    }
}

这段代码定义了一个自定义结构体`MyStruct`,其中包含一个字段`data`,它是一个存放`u32`类型数据的向量(Vector)。

然后,代码实现了一个名为`from_iter`的关联函数,它有一个名为`iter`的参数,参数类型为实现了`IntoIterator` trait 的类型,且该迭代器的元素类型为`u32`。该函数的作用是将迭代器中的元素收集到`data`字段中,并返回一个新的`MyStruct`实例。

接下来,代码实现了`std::iter::FromIterator<u32>` trait,其中的`from_iter`函数与之前的`from_iter`函数相同,只是实现了一个不同的trait。这个trait是标准库中的一个trait,它允许对实现了`IntoIterator<Item = T>` trait 的迭代器类型调用`collect`方法来生成一个新的实例。

使用这段代码,可以这样创建一个`MyStruct`实例:

rust:
let my_struct: MyStruct = vec![1, 2, 3].into_iter().collect();

其中,`vec![1, 2, 3]`创建了一个整型向量`Vec<u32>`,然后调用`into_iter`方法将其转换为一个迭代器,并最后调用`collect`方法将迭代器中的元素收集到一个新的`MyStruct`实例中。

Additions to the prelude - The Rust Edition Guide (rust-lang.org)