move 学习
move: 单个程序被组织成一个包
包:Move.toml和源文件
Move.toml: 关于包的元数据
源文件:模块的源代码
move语言中的,模块下的成员都是私有的
在开发过程包没有地址,需要将其设置为0x0
sui的地址是32字节
账户是有私钥生成,并且又地址标识的,账户可以拥有对象,并且可以发送交易,每一笔交易有一个发件人,并且发件人由地址标识
基础
模块
move中的模块的所有成员都是模块的私有成员
用 module关键字后跟包地址,模块名称,分号和模块的主体.
模块是定义类型的核心程序单元。
基础语法:
module <address>::<identifier> { |
注释
行注释: // 即被编译器忽略的
阻止注释:/* 开头,结尾 */ ,注释多行,块注释,注释调代码块
文档注释:用于为伪代码生成文档的特殊注释。///
基本类型
let声明变量,mut 关键字来可变
let <variable_name>[: <type>] = <expression>; |
例如:
let x: bool = true; |
用等号重新赋值可变变量
y = 43; |
也可以重新声明变量,来隐藏它们
let x: u8 = 42; |
显示转换,用as
let x: u8 = 42; |
地址
每一个模块部署在特定的地址
使用的话,就是使用use的关键字
module 0x1::Coin{ |
表达式
字符串就是字节
使用b来将字符串转化为verctor
move语言中没有string,但是可以自己去引用一个
函数
函数的返回值用:来表示
|
块
块是用{},它返回的是块中最后一个表达式的值
本质和rust一样的,最后一个没有分号,代表返回它自己,如果有,则还是返回()
|
所有权
在函数中的定义的变量归此作用域所有,函数作用域结束后,变量中的定义的被删除或解除分配
module book :: ownership; |
区块也算一个作用域
module book::ownership; |
如果区块或者函数有返回值,那么调用方就拥有这个变量的所有权
module book::ownership; |
技能
move有一个技能复制
具有复制能力:bool,无符号整数,向量,地址,选择,字符串,类型名称
引用
在不放弃所有权得情况下向函数显示值得方法
使用&来表示选择变量的值,是对值得引用,也叫做借用。
- 可变引用:希望修改变量得值,就使用这个&mut 可变引用。
泛型
定义可以处理任何类型或者函数得方法,也就是说,它的参数的类型任意的 通常使用<>来表示,
函数使用时也要加<>,这样才能告诉编译器这个函数对某个任意的T都适用。
类型反射
类型反射一般是指在运行时获取类型信息,判断类型,但是move是一个静态语言,安全优先,面向区块链的语言,有特殊的方式提供了类型反射
TypeName
move是一个静态的语言,所有的类型在编译时确定,但有时候。我们希望在运行是知道某一个值得具体类型,比如:
- 调试时输出一个值得类型名字
- 不同类型资源得统一管理
- 做类似多态类型行为得模拟
然后就需要用=一种轻量级得类型反射机制——TypeName
use std::type_name::type_name; |
测试
move的测试属性是:#[test],就是告诉编译器该函数是一个测试函数,应该在执行测试时运行,测试函数是常规的函数,但是它们必须不接受任何的参数,也没有返回值
运行测试时,使用 sui move test
测试失败案例使用,#[expected_failure],也就是说,你在告诉这个编译器测试预计会怀疑失败。
对象模型
sui中的对象是代表数字资产的高级抽象,对象具有类型,唯一的ID,所有者,数据,版本何摘要,对象模型简化了资产管理并支持广泛的用例
所有权
- 账户所有者: 一个对象由单个账户拥有
- 共享状态:对象可以网络共享
- 不可变(冻结)状态:冻结对象模型,其中对象永久只读,不能修改或移动,从而提供稳定且恒定的所有网络参与者都可以访问的状态