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 を使用すると、ループを無限に続けることができます。ループの制御にはcontinue
とbreak
を使用します。まず、例を見てみましょう:
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 の組み合わせた書き方は、一般的な式の計算結果の取得方法に基づいたシンタックスシュガーと考えることができます。