move 语言中,phatom关键字的作用是什么?

G-XBT
发布于 阅读 656

1,英文意思

phatom的英文意思是虚幻的幻影。

2,phantom作用

在move 语言中,phatom 通常是一个占位符,是一个标注,用来告诉编译器,这是一个有意义的结构体。但是却在实际编译中不会产生任何作用。

3,使用例子,如何使用move 语言发一个币?

3.1 一个能够使用,但是不够好的方案。

例如:我们想发一个erc20,我们有如下结构。

struct Coin has store { 
    value: u64,
}

这在单个token 没有问题。如果我们想发其他的币呢,一个不是很好的解决方案,我们可以写大量不同名字,但是结构相同的币。

3.2 一个更好的方案。

但是如果我们想复用一个erc20的结构呢?我们可以使用范型,类似以下的结构。

struct Coin<T> has store { 
   value: u64,
}

这样我们可以在任意代码模块,通过给定一个具体的类型参数,来使用一个通用结构。
比如:

 struct Eth  { }; 
 let ethCoin = Coin<Eth>;

move 编译器不会允许以上结构通过。首先Eth结构体没有store能力声明,无法存储到全局。

我们可以通过给Eth 增加store 能力声明解决这个问题,但是这会带来新的问题。首先,因为Eth结构本来就没有存储任何东西,而故意增加store能力,这破坏了类型安全。其次,虚假的标注,会有传播,污染的可能。

那么有没有解决方案呢?move 的设计者,提供了phantom 关键字标注,可以放宽类型检查,使用 phantom 去告诉编译器,这是正确的类型。

struct Coin<phantom T> has store { 
     value: u64,
}

需要注意的是,只能使用phantom 去标注,需要定义是范型结构,而范型结构体的字段中,却不使用的范型结构体。如上面的例子中,声明了Coin< phantom T>范型结构体,但是却没有在其定义的字段中使用。

4, phantom 的使用场景,

在需要使用范型,和不需要使用范型之间。如果在编码中,发现,不用范型不好,使用范型也不够好。那么就可以考虑使用phantom。

标签: 每日闲话
评论