StarknetAstro

StarknetAstro

09_Cairoのフロー制御

09_Cairo 中のフロー制御#

この記事で使用されている Cairo コンパイラのバージョン:2.0.0-rc0。Cairo は急速に更新されているため、異なるバージョンの構文にはわずかな違いがありますが、将来的には安定したバージョンに記事の内容を更新する予定です。

if 文#

use debug::PrintTrait;

fn main() {
    let number = 3;

    if number == 3 {
        'condition was true'.print();
    } 
}

使用方法は非常に簡単で、条件を括弧で囲む必要はありません。

複数の条件判断の場合を見てみましょう:

use debug::PrintTrait;

fn main() {
    let number = 3;

    if number == 12 {
        'number is 12'.print();
    } else if number == 3 {
        'number is 3'.print();
    } else if number - 2 == 1 {
        'number minus 2 is 1'.print();
    } else {
        'number not found'.print();
    }
}

複数の条件判断は、上から下に順番に実行され、条件を満たすと直ちに次の条件判断は行われません。上記の例では、2 番目の条件 number == 3 が満たされているため、3 番目の条件は true でも実行されません。

特殊な if 文、三項演算子と同じ効果を実現する#

この文は、let 文と if 文を組み合わせて使用します。

use debug::PrintTrait;

fn main() {
    let condition = true;
    let number = if condition {5} else {6};

    if number == 5 {
        'condition was true'.print();
    }
}

上記のコードでは、condition が true の場合、number は 5 となります。condition が false の場合、number は 6 となります。

solidity の三項演算子は次のようになります:

bool condition = true;
uint256 a = condition ? 5 : 6;

loop ループ文#

loop を使用すると、ループを無限に続けることができます。ループの制御にはcontinuebreakを使用します。まず、例を見てみましょう:

use debug::PrintTrait;

fn main() {
    let mut i: usize = 0;
    loop {
        i += 1;

        if i < 10 {
            'again'.print();
            continue;
        }

        if i == 10 {
            break ();
        };
    }
}

上記のコードでは、i が増加し、10 未満の場合は continue 命令を使用して次のループに直接進みます。continue 以下のロジックは実行されません。i が 10 と等しい場合、break 命令を使用してループを抜けます。

  • break の後には戻り値を追加する必要があります。戻り値がない場合は、空の値型()を使用しますが、省略することはできません。

注意⚠️:loop を含む Cairo コードを実行する場合、--available-gasオプションを使用して Gas の上限を指定する必要があります。例:

cairo-run --available-gas 200000 $CairoFile

loop の戻り値の取得#

前述のように、break には戻り値を指定する必要があります。この戻り値を取得することができます:

use debug::PrintTrait;

fn main() {
    let mut i: usize = 0;
    let t = loop {
        i += 1;

        if i >= 10 {
            break i;
        };
    };

    t.print();
}

上記のコードでは、t の最終的な値は 10 です。

if と loop の共通点:式の計算結果の取得#

if と loop の両方とも、let と組み合わせて式の計算結果、つまり波括弧内のコードの戻り値を取得することができます。前述のように:

let number = if condition {5} else {6};

および

let t = loop {
    i += 1;

    if i >= 10 {
        break i;
    };
};

Cairo では、一般的な式の計算結果の取得方法として、波括弧内のコードブロックの戻り値を直接取得することができます。

use debug::PrintTrait;

fn main() {
    let y = {
        let x = 3;
        x + 1
    };

    y.print();
}

if と loop と let の組み合わせた書き方は、一般的な式の計算結果の取得方法に基づいたシンタックスシュガーと考えることができます。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。