move: 单个程序被组织成一个包
:Move.toml和源文件
Move.toml: 关于包的元数据
源文件:模块的源代码
move语言中的,模块下的成员都是私有的

在开发过程包没有地址,需要将其设置为0x0

sui的地址是32字节

账户是有私钥生成,并且又地址标识的,账户可以拥有对象,并且可以发送交易,每一笔交易有一个发件人,并且发件人由地址标识

基础

模块

move中的模块的所有成员都是模块的私有成员

module关键字后跟包地址,模块名称,分号和模块的主体.

模块是定义类型的核心程序单元。

基础语法:

module <address>::<identifier> {
(<use> | <type> | <function> | <constant>)*
}

注释

行注释: // 即被编译器忽略的

阻止注释:/* 开头,结尾 */ ,注释多行,块注释,注释调代码块

文档注释:用于为伪代码生成文档的特殊注释。///

基本类型

let声明变量,mut 关键字来可变

let <variable_name>[: <type>]  = <expression>;
let mut <variable_name>[: <type>] = <expression>;

例如:

let x: bool = true;
let mut y: u8 = 42;

用等号重新赋值可变变量

y = 43;

也可以重新声明变量,来隐藏它们

let x: u8 = 42;
let x: u16 = 42;

显示转换,用as

let x: u8 = 42;
let y: u16 = x as u16;
let z = 2 * (x as u16); // ambiguous, requires parentheses

地址

每一个模块部署在特定的地址

使用的话,就是使用use的关键字

module 0x1::Coin{
//模块内容
}

地址以0x为前缀,32字节,代表区块链上的任何地
地址::模块名

```move
// address literal
let value: address = @0x1;

// named address registered in Move.toml
let value = @std;
let other = @sui;

表达式

字符串就是字节

使用b来将字符串转化为verctor,也就是数字

move语言中没有string,但是可以自己去引用一个

函数

函数的返回值用:来表示


public fun call_internal () :u64{
43
}

块是用{},它返回的是块中最后一个表达式的值
本质和rust一样的,最后一个没有分号,代表返回它自己,如果有,则还是返回()


let sum = {
let a = 1;
let b = 2;
a+b // 返回的是a+b的和
}

///如果修改一下

let sum = {
let a = 1;
let b = 2;
a + b; // 返回的是()
}

所有权

在函数中的定义的变量归此作用域所有,函数作用域结束后,变量中的定义的被删除或解除分配

module book :: ownership;

pubilc fun owner() {
let a = 1;
}

区块也算一个作用域

module book::ownership;

public fun owner() {
let a = 1; // a is owned by the `owner` function's scope
{
let b = 2; // the block that declares b owns it
{
let c = 3; // the block that declares c owns it
}; // c is dropped here
}; // b is dropped here
// a = b; // error: b is not valid here
// a = c; // error: c is not valid here
} // a is dropped here

如果区块或者函数有返回值,那么调用方就拥有这个变量的所有权

module book::ownership;

public fun owner(): u8 {
let a = 1; // a is owned by the `owner` function's scope
let b = {
let c = 2; // the block that declares c owns it
c // c is returned from the block and transferred to b
};
a + b // both a and b are valid here
}

技能

move有一个技能复制

具有复制能力:bool,无符号整数,向量,地址,选择,字符串,类型名称

引用

在不放弃所有权得情况下向函数显示值得方法

使用&来表示选择变量的值,是对值得引用,也叫做借用。

  • 可变引用:希望修改变量得值,就使用这个&mut 可变引用。

泛型

定义可以处理任何类型或者函数得方法,也就是说,它的参数的类型任意的 通常使用<>来表示,
函数使用时也要加<>,这样才能告诉编译器这个函数对某个任意的T都适用。

类型反射

类型反射一般是指在运行时获取类型信息,判断类型,但是move是一个静态语言,安全优先,面向区块链的语言,有特殊的方式提供了类型反射

TypeName :是一个可以标识类型的特殊结构,它在编译时就生成了类型信息

move是一个静态的语言,所有的类型在编译时确定,但有时候。我们希望在运行是知道某一个值得具体类型,比如:

  • 调试时输出一个值得类型名字
  • 不同类型资源得统一管理
  • 做类似多态类型行为得模拟

然后就需要用=一种轻量级得类型反射机制——TypeName

use std::type_name::type_name;
use std::string::String;

fun get_type_name<T>(): String {
type_name<T>() // 返回类型 T 的名字
}

测试

move的测试属性是:#[test],就是告诉编译器该函数是一个测试函数,应该在执行测试时运行,测试函数是常规的函数,但是它们必须不接受任何的参数,也没有返回值

运行测试时,使用 sui move test

测试失败案例使用,#[expected_failure],也就是说,你在告诉这个编译器测试预计会怀疑失败。

对象模型

sui中的对象是代表数字资产的高级抽象,对象具有类型,唯一的ID,所有者,数据,版本何摘要,对象模型简化了资产管理并支持广泛的用例

所有权

  • 账户所有者: 一个对象由单个账户拥有
  • 共享状态:对象可以网络共享
  • 不可变(冻结)状态:冻结对象模型,其中对象永久只读,不能修改或移动,从而提供稳定且恒定的所有网络参与者都可以访问的状态