Skip to content

自定义数据类型:结构体

在 Move 语言中,结构体 是一种强大的自定义数据类型,它允许开发者将不同类型的数据组合在一起,形成一个新的数据结构。想象一下,我们要存储一个 “用户” 的信息,包括姓名、年龄、地址等。如果使用基本数据类型,我们需要分别声明多个变量,但如果使用结构体,就可以将这些信息整合到一个 “用户” 结构体中,更方便管理和使用。

定义结构体

要定义一个结构体,我们需要使用 struct 关键字,后面跟着结构体的名称,然后在大括号 {} 中定义结构体的字段。每个字段由字段名和字段类型组成,字段之间用逗号分隔。例如:

move
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>,
    }
}

在上面的例子中,我们定义了两个结构体:ArtistRecordArtist 结构体只有一个字段 name,类型为 StringRecord 结构体有五个字段:titleartistyearis_debuteditionartist 字段的类型是 Artist 结构体,这表明结构体可以嵌套使用。

默认情况下,结构体和它的字段都是私有的,只能在定义它的模块内部使用。如果想让其他模块也能使用,可以使用 public 关键字将其公开。

创建和使用结构体实例

定义好结构体后,就可以创建结构体的实例,就像用积木模型的图纸制造出具体的模型一样。创建结构体实例时,需要指定每个字段的值。例如:

move
// 创建一个 Artist 结构体的实例
let mut artist = Artist { 
    name: b"The Beatles".to_string() 
};

在上面的例子中,我们创建了一个 Artist 结构体的实例,并将 name 字段的值设置为字符串 “The Beatles”。 mut 关键字表示这个实例是可变的,我们可以修改它的字段值。

访问结构体的字段

要访问结构体的字段,可以使用点操作符 .。例如:

move
// 访问 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 关键字和模式匹配来解构结构体。变量名需要与结构体字段名完全一致。例如:

move
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);

忽略不需要的字段

如果我们只需要访问结构体中的某些字段,可以使用 _ 忽略不需要的字段。例如:

move
// 只需要访问 title 和 artist 字段
let Record { title, artist, _ } = record;

修改字段的可变性

默认情况下,解构出来的变量是不可变的。如果需要将某个字段赋值给一个可变变量,可以使用 mut 关键字。例如:

move
// 让整个 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 语言中一种强大的自定义数据类型,它允许开发者将不同类型的数据组合在一起,形成一个新的数据结构,提高代码的可读性和可维护性。结构体解构可以让我们更方便地访问和使用结构体的字段,提高代码的可读性和简洁性。