用另一个数据结构初始化 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是字段的类型,在结构体StType2和StType3[=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)]
。我为什么要现在添加它?当 StType3 在 StType2[=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
方法需要self
by-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
,即整个结构,调用后您将无法访问任何其他字段。
我最近开始用 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是字段的类型,在结构体StType2和StType3[=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 theCopy
trait
我通过添加到 StType1 #[derive(Clone)]
来解决它。但它之前使用 StType2 没有 #[derive(Clone)]
。我为什么要现在添加它?当 StType3 在 StType2[=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
方法需要self
by-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
,即整个结构,调用后您将无法访问任何其他字段。