プログラミング言語において、式(expression)は値を返すコードの単位です。Moveでは、ほとんどすべてが式であり、唯一の例外は宣言であるletステートメントです。このセクションでは、式の種類を取り上げ、スコープの概念を紹介します。

式はセミコロン ; で区切られます。セミコロンの後に「式がない」場合、コンパイラは単位 () (空の式)を挿入します。

リテラル

プリミティブ型のセクションで、Moveの基本的な型を紹介しました。そしてそれらを示すためにリテラルを使用しました。リテラルは、ソースコード内で固定値を表すための表記法です。リテラルは変数を初期化したり、関数に引数を渡すために使用されます。Moveには次のリテラルがあります:

let b = true;     // trueはリテラルです
let n = 1000;     // 1000はリテラルです
let h = 0x0A;     // 0x0Aはリテラルです
let v = b"hello"; // b'hello'はバイトベクトルリテラルです
let x = x"0A";    // x'0A'はバイトベクトルリテラルです
let c = vector[1, 2, 3]; // vector[]はベクトルリテラルです

演算子

算術、論理、ビット単位の演算子は、値に対して操作を行うために使用されます。操作の結果は値であるため、演算子も式です。

let sum = 1 + 2;   // 1 + 2は式です
let sum = (1 + 2); // 括弧を使用した同じ式
let is_true = true && false; // true && falseは式です
let is_true = (true && false); // 括弧を使用した同じ式

ブロック

ブロックは、ステートメントと式のシーケンスであり、ブロックの最後の式の値を返します。ブロックは波括弧 {} のペアで書かれ、式であるため、式が期待されるどこでも使用できます。

// 空の式を含むブロックですが、コンパイラは
// 自動的に空の式 `()` を挿入します:`let none = { () }`
// let none = {};

// letステートメントと式を含むブロック。
let sum = {
    let a = 1;
    let b = 2;
    a + b // ブロックの値は最後の式です
};

// ブロックは式なので、式の中で使用できますし、
// 変数に割り当てる必要はありません。
{
    let a = 1;
    let b = 2;
    a + b; // 返されません - セミコロン。
    // コンパイラが自動的に空の式 `()` を挿入します
};

関数呼び出し

関数については関数 セクションで詳しく説明します。しかし、すでに前のセクションで関数呼び出しを使用しているため、ここでそれについて触れます。関数呼び出しは関数を呼び出す式であり、関数本体の最後の式の値を返します。

fun add(a: u8, b: u8): u8 {
    a + b
}

#[test]
fun some_other() {
    let sum = add(1, 2); // add(1, 2)はu8型の式です
}

制御フロー式