用另一个数据结构初始化 Rust 中数据结构的字段

Initialize data structure's field in Rust with another data structure

我最近开始用 Rust 编程,现在想创建一个结构,我想使用其他结构分配哪些字段。在我正在使用的代码库中,有以下示例:

pub struct StType1 {
    f1: String,
    f2: bool,
    f3: usize,
}

pub struct StType2 {
    // ...
    field1: StType1,
    // ...
}

impl StType2 {

    // ...

    pub fn build(mut self) {

        // ...

        let st = StType3 {
            field1: self.field1,
        };

        // ...

    }


    pub fn field1(&self) -> &StType1 {
        &self.field1
    }
}

struct StType3 {

   field1: StType1,
   // ...

}

StType1是字段的类型,在结构体StType2StType3[=50中都包含=]. StType2 而 运行 build() 函数创建 StType3 并且它们应该具有相同的值字段 1.

在这段代码中没有移动,在这个作业中似乎也没有复制 field1: self.field1;。为什么?然后会发生什么?

我问是因为当我尝试创建类似于 StType3 - ObjType - 此文件外的结构时:

let object1 = StType2::new(...);
let object2 = ObjType {
            field1: object1.field1().clone(),
}

在我的函数中,我在 clone() 之后得到了对 StType1 的引用,而不是对象,当我这样做时:

let object1 = StType2::new(...);
let object2 = ObjType {
            field1: *object1.field1().clone(),
}

我收到一个错误 Can't move:

move occurs because value has type StType1, which does not implement the Copy trait

我通过添加到 StType1 #[derive(Clone)] 来解决它。但它之前使用 StType2 没有 #[derive(Clone)]。我为什么要现在添加它?当 StType3StType2[=50= 中创建时,为什么 field1 没有移动发生(或不需要克隆) ] 并且 field1 已初始化?

In this code there is no move and seems no copy in this assignment field1: self.field1. Why? What happens then?

这是不正确的——这里一个移动,因为 Rust 默认移动。

这是可能的,因为在上面的声明中:

pub fn build(mut self) {

self之前没有&,所以这个build方法需要selfby-move.

相比之下,下面的方法:

pub fn field1(&self) -> &StType1 {
    &self.field1
}

采用&self,即一个参考,returns &StType1,另一个参考。因此,要获得 StType1 来构造您的对象,您需要通过调用 .clone() 使其拥有它。但这只有在 StType1 实现 Clone 时才有效,这就是为什么你必须向它添加 #[derive(Clone)]

或者,您可以更改 field1() 方法以同时采用 self by-move:

pub fn field1(self) -> StType1 {
    self.field1
}

这种方法的缺点是,由于它会消耗 self,即整个结构,调用后您将无法访问任何其他字段。