学习 struct 定义 掌握 struct 定义代码位置 掌握 struct 命名规则 掌握 struct 不能递归 掌握 struct支持多种不同类型: 无符号整数、布尔值bool、地址address、字符串String、向量vecto
结构体必须定义在模块内部
address 0x2 {
struct Foo { x: u64, y: bool }//这是错误的位置
module myModule {
struct Foo { x: u64, y: bool }//正确位置
}
}
2. 命名规则:必须以大写字母A-Z开头,其余部分可以是字母A-Z, a-z, 数字0-9或下划线_
3. 不能递归自身结构体
``` Move
public struct Foo {
/// HINT: 结构体可以包含多个字段
/// HINT: 不能递归定义结构体
// TODO: 注释掉递归错误
foo: Foo//这是递归自身
}
struct Baz {
name:vector<u8>,
foo: Foo
}
fun example() {
let foo = Foo { x: 0, y: false };
let baz = Baz { foo: foo }; }
// 上面字段名称相同可以简写成:
let baz = Baz { foo };//字段名称双关
结构的字段只能在定义该结构的模块内部访问。 所以我们必须提供API让外部来访问修改数据。
/// HINT: 访问 Foo 结构体x值
/// TODO: 返回 x
public fun get_foo_x(foo: &Foo):u64 {
/// TODO: 访问 foo 的字段 x
foo.x
//0 // 临时返回值,需要替换成 foo.x
}
/// HINT: 访问 Foo 结构体y值
/// TODO: 返回 y
public fun get_foo_y( foo: &Foo):bool {
/// TODO: 访问 foo 的字段 y
foo.y
// true // 临时返回值,需要替换成 foo.y
}
### 4、解构Struct
结构体需要解构的几种方法
/// 销毁 Foo 结构体的实例 public fun destroy_foo(foo: Foo): (u64,bool){
/// HINT: 销毁结构体实例
/// TODO: 销毁 foo 实例
let Foo {x,y}=foo;
(x, y)
//(0, true) // 临时返回值,需要替换
}
/// 销毁 Foo 结构体的实例,使用通配符
/// HINT: 通配符 _ 可以匹配任何值
public fun destroy_foo_wildcard(foo: Foo) {
/// TODO: 使用通配符解构foo
let Foo { x: _, y: _ } = foo;
}
public fun destroy_foo_assignment(foo: Foo): (u64, bool) {
/// HINT: 使用赋值语句解构 foo
/// TODO: 申明变量 x:u64, y:bool
/// TODO: 使用赋值语句解构 foo
let x: u64;
let y: bool;
let Foo { x, y } = foo;
(x,y)
//(0, true) // 临时返回值,需要替换成(x,y)
}
如有不正确的,欢迎交流指正。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!