Move on Aptos 春季训练营笔记 | 01 & 02

02 Move 语言与变量

变量

变量：是有名字的对象；

对象：存储某个类型值的内存区域；（类似 C++ 的指针）

值：按照类型进行解释的 bytes 集合；

类型：定义可能值的操作

存储

值类型

通过栈进行存储

简单类型：布尔、整数、浮点数…

引用类型

通过堆进行存储

复杂类型：对象、数组、类、函数…

通常我们定义一个变量为对象时，其对象的值存储在堆上，其堆内存的索引存储在栈上，用栈上的索引指向堆上存储的引用类型数据。(变量指向对象）

Move 核心差异

在值类型与引用类型关系上，不同于其他语言的索引方式。而是以 “所有权” 来作为引用类型的操作。

所有权只能同时由 1 “人” 拥有；

所有权以转移的形式流转给其他变量；

例如：

B = A;

C = B;

此时 B 为空，而 C 指向 A。

这样的好处：

避免内存泄露，不同于其他语言，在编译阶段就可以告知什么时候可以回收内存；

提高内存使用效率，避免对引用类型的不必要拷贝；

更好的可读性和可维护性；

03 uint，Stirng，Bool，address 四大类型

unint 类型

多种写法

Copy
#[test]
fun test_num(){
let num_u8: u8 = 42; // 0-2**8-1
let num_u8_2: u8 = 43u8;
let num_u8_3: u8 = 0x2A;//hash
let num_u256:u256 = 100_000;
let num_sum: u256 = (num_u8 as u256) + num_u256;
print(&num_u8); //42
print(&num_u8_2); //43
print(&num_u8_3); // 42
print(&num_u256); //100000
}

Bool 类型

Copy
#[test]
fun test_bool(){
let bool_true: bool = true;
let bool_false: bool = false;
print(&bool_true); //true
print(&bool_false); //false
print(&(bool_true == bool_false)); //false
}

String 类型

Copy
#[test]
fun test_string(){
let str:String = utf8(b"hello world");
print(&str); //"hello world"
}

address 类型

输出是 @0×2a 其实中间会自动补 0

Copy
#[test]
fun test_addr(){
let addr:address = @0x2A;
let addr2:address = @0x000000000000000000000000000000000000000000000A;
print(&addr); //@0x2a -> @0x(0000...)2a
print(&addr2); //@xa
}