02 Move 言語と変数#
変数#
-
変数:名前の付いたオブジェクトです。
-
オブジェクト:特定の型の値を格納するメモリ領域です。(C++ のポインタに似ています)
-
値:型に従って解釈されるバイトの集まりです。
-
型:可能な値を定義します。
ストレージ#
-
値型
-
スタックを使用して格納されます。
-
シンプルな型:ブール、整数、浮動小数点数...
-
-
参照型
-
ヒープを使用して格納されます。
-
複雑な型:オブジェクト、配列、クラス、関数...
-
通常、変数をオブジェクトとして定義すると、そのオブジェクトの値はヒープに格納され、ヒープメモリのインデックスがスタックに格納され、スタックのインデックスがヒープに格納された参照型データを指します。(変数はオブジェクトを指します)
Move の主な違い#
値型と参照型の関係において、他の言語とは異なるインデックス方法ではありません。代わりに、「所有権」を参照型の操作として使用します。
-
所有権は同時に 1 つの「人」しか持つことができません。
-
所有権は他の変数に転送する形で流れます。
例:
B = A;
C = B;
この時点で、B は空になり、C は A を指します。
このような利点があります:
-
メモリリークを回避し、他の言語とは異なり、コンパイル段階でメモリを回収するタイミングを知ることができます。
-
メモリの使用効率を向上させ、参照型の不要なコピーを避けます。
-
より良い可読性と保守性を提供します。
03 uint,Stirng,Bool,address の 4 つの主要な型#
uint 型#
複数の書き方があります
#[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
}