自定义数据类型:结构体
在 Move 语言中,结构体 是一种强大的自定义数据类型,它允许开发者将不同类型的数据组合在一起,形成一个新的数据结构。想象一下,我们要存储一个 “用户” 的信息,包括姓名、年龄、地址等。如果使用基本数据类型,我们需要分别声明多个变量,但如果使用结构体,就可以将这些信息整合到一个 “用户” 结构体中,更方便管理和使用。
定义结构体
要定义一个结构体,我们需要使用 struct
关键字,后面跟着结构体的名称,然后在大括号 {}
中定义结构体的字段。每个字段由字段名和字段类型组成,字段之间用逗号分隔。例如:
module example::record {
use std::string::String;
use std::option::Option;
/// 一个表示艺术家的结构体
public struct Artist {
/// 艺术家的名字
name: String,
}
/// 一个表示音乐唱片的结构体
public struct Record {
/// 唱片的标题
title: String,
/// 唱片的艺术家, 使用 Artist 类型
artist: Artist,
/// 唱片发行的年份
year: u16,
/// 唱片是否是首张专辑
is_debut: bool,
/// 唱片的版本
edition: Option<u16>,
}
}
在上面的例子中,我们定义了两个结构体:Artist
和 Record
。Artist
结构体只有一个字段 name
,类型为 String
。Record
结构体有五个字段:title
、artist
、year
、is_debut
和 edition
。artist
字段的类型是 Artist
结构体,这表明结构体可以嵌套使用。
默认情况下,结构体和它的字段都是私有的,只能在定义它的模块内部使用。如果想让其他模块也能使用,可以使用 public
关键字将其公开。
创建和使用结构体实例
定义好结构体后,就可以创建结构体的实例,就像用积木模型的图纸制造出具体的模型一样。创建结构体实例时,需要指定每个字段的值。例如:
// 创建一个 Artist 结构体的实例
let mut artist = Artist {
name: b"The Beatles".to_string()
};
在上面的例子中,我们创建了一个 Artist
结构体的实例,并将 name
字段的值设置为字符串 “The Beatles”。 mut
关键字表示这个实例是可变的,我们可以修改它的字段值。
访问结构体的字段
要访问结构体的字段,可以使用点操作符 .
。例如:
// 访问 Artist 结构体实例的 name 字段
let artist_name = artist.name;
// 断言 artist 的 name 字段是否等于 "The Beatles"
assert!(artist.name == b"The Beatles".to_string());
// 修改 artist 的 name 字段
artist.name = b"Led Zeppelin".to_string();
// 再次断言 artist 的 name 字段是否等于 "Led Zeppelin"
assert!(artist.name == b"Led Zeppelin".to_string());
结构体解构
结构体解构是指将结构体的字段分别赋值给不同的变量。这就像将积木模型拆解,把每个积木块分别拿出来一样。解构结构体可以让我们更方便地访问和使用结构体的字段。
使用 let
关键字解构
可以使用 let
关键字和模式匹配来解构结构体。变量名需要与结构体字段名完全一致。例如:
let record = Record {
title: b"Sgt. Pepper's Lonely Hearts Club Band".to_string(),
artist: Artist { name: b"The Beatles".to_string() },
year: 1967,
is_debut: false,
edition: Some(1),
};
// 将 record 结构体的字段分别赋值给不同的变量
let Record { title, artist, year, is_debut, edition } = record;
// 现在可以分别使用这些变量
assert!(title == b"Sgt. Pepper's Lonely Hearts Club Band".to_string());
assert!(artist.name == b"The Beatles".to_string());
assert!(year == 1967);
忽略不需要的字段
如果我们只需要访问结构体中的某些字段,可以使用 _
忽略不需要的字段。例如:
// 只需要访问 title 和 artist 字段
let Record { title, artist, _ } = record;
修改字段的可变性
默认情况下,解构出来的变量是不可变的。如果需要将某个字段赋值给一个可变变量,可以使用 mut
关键字。例如:
// 让整个 record 实例是可变的
let mut record = Record {
title: b"Sgt. Pepper's Lonely Hearts Club Band".to_string(),
artist: Artist { name: b"The Beatles".to_string() },
year: 1967,
is_debut: false,
edition: Some(1),
};
// 修改 title 字段的值
record.title = b"Abbey Road".to_string();
// 断言字段值
assert!(record.title == b"Abbey Road".to_string());
assert!(record.artist.name == b"The Beatles".to_string());
总结
结构体是 Move 语言中一种强大的自定义数据类型,它允许开发者将不同类型的数据组合在一起,形成一个新的数据结构,提高代码的可读性和可维护性。结构体解构可以让我们更方便地访问和使用结构体的字段,提高代码的可读性和简洁性。