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
    }