在之前对象的章节,我们讲被嵌套的对象的时候,
举了一个例子:人(Person对象)可能拥有0个或者多个笔记本电脑,但在实际生活中,我们不仅仅可以拥有笔记本电脑,我们还可以拥有平板电脑、手机、台式机、游戏机等电子设备。
那Person对象的定义将会变成如下:
public struct Person has key {
id: UID,
name: String,
//拥有的笔记本
notebooks: vector<Notebook>,
//拥有的手机
mobile_phones: vector<MobilePhone>,
//拥有的游戏机
game_consoles: vector<GameConsole>,
//拥有的平板电脑
ipads: vector<Ipad>,
}
public struct Notebook has key,store {
id: UID,
brand: String,
model: String,
}
public struct MobilePhone has key,store {
id: UID,
brand: String,
model: String,
number: u64,
}
public struct GameConsole has key,store {
id: UID,
brand: String,
model: String,
games: vector<u8>,
}
public struct Ipad has key,store {
id: UID,
brand: String,
model: String,
size: u64,
}
Person对象嵌套了一堆对象,但事实上有的老年人没有任何电子设备,那这个实例化这个老人的Person对象就得带着四个空的对象数组,不仅没有任何意义还会消耗GAS。
再者如果每出现一个新型电子设备,就得给Person对象增加一个字段,不仅麻烦,后面Person对象的定义会变得又臭又长,难以维护。如果达到嵌套对象数量的上限,甚至会影响业务实现。
有没有一种方法,可以让对象只嵌套需要的对象,不限名称不限类型,还可以动态的嵌套,动态解除嵌套对象?
这时候就要用到动态字段了。
现在Person对象的类型定义就可以去掉所有电子设备相关的字段:
public struct Person has key {
id: UID,
name: String,
}
定义Notebook,MobilePhone等电子设备