02 移动语言与变量#
变量#
-
变量:是有名字的对象;
-
对象:存储某个类型值的内存区域;(类似 C++ 的指针)
-
值:按照类型进行解释的 bytes 集合;
-
类型:定义可能值的操作
存储#
-
值类型
-
通过栈进行存储
-
简单类型:布尔、整数、浮点数…
-
-
引用类型
-
通过堆进行存储
-
复杂类型:对象、数组、类、函数…
-
通常我们定义一个变量为对象时,其对象的值存储在堆上,其堆内存的索引存储在栈上,用栈上的索引指向堆上存储的引用类型数据。(变量指向对象)
Move 核心差异#
在值类型与引用类型关系上,不同于其他语言的索引方式。而是以 “所有权” 来作为引用类型的操作。
-
所有权只能同时由 1 “人” 拥有;
-
所有权以转移的形式流转给其他变量;
例如:
B = A;
C = B;
此时 B 为空,而 C 指向 A。
这样的好处:
-
避免内存泄露,不同于其他语言,在编译阶段就可以告知什么时候可以回收内存;
-
提高内存使用效率,避免对引用类型的不必要拷贝;
-
更好的可读性和可维护性;
03 uint,Stirng,Bool,address 四大类型#
unint 类型#
多种写法
#[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 类型#
#[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 类型#
#[test]
fun test_string(){
let str:String = utf8(b"hello world");
print(&str); //"hello world"
}
address 类型#
输出是 @0×2a 其实中间会自动补 0
#[test]
fun test_addr(){
let addr:address = @0x2A;
let addr2:address = @0x000000000000000000000000000000000000000000000A;
print(&addr); //@0x2a -> @0x(0000...)2a
print(&addr2); //@xa
}