01_Cairo 中の変数#
この記事で使用されている Cairo コンパイラのバージョン:2.0.0-rc0。Cairo は急速に更新されているため、異なるバージョンでは少し異なる構文がありますが、将来的には安定したバージョンに記事の内容を更新する予定です。
変数はプログラミング言語で最も基本的な要素です。
基本的な使用法#
変数を作成する
use debug::PrintTrait;
fn main() {
let x = 5;
let y:u8 = 6;
x.print();
}
変数を作成するには、let キーワードを使用します。PrintTrait は公式ライブラリで提供される印刷ツールライブラリです。
変数の可変性#
Cairo では、変更できないメモリモデル(immutable memory model)が使用されており、メモリスペースに値が割り当てられた後は上書きすることはできず、読み取ることしかできません。
これは、Cairo のすべての変数がデフォルトで変更不可能であることを意味します(少し直感に反しているかもしれません🙃️)。
次のコードを実行してみてください(コマンド:cairo-run --path $FILE_CAIRO
を使用)
use debug::PrintTrait;
fn main() {
let x = 5;
x.print();
x = 6;
x.print();
}
次のエラーが表示されます
error: Cannot assign to an immutable variable.
--> c01_var.cairo:5:5
x = 6;
^***^
Error: failed to compile: src/c01_var.cairo
したがって、変数を変更可能にするには、mut キーワードを使用する必要があります。
use debug::PrintTrait;
fn main() {
let mut x = 5;
x.print();
x = 6;
x.print();
}
上記の例では、x 変数の前に mut キーワードが追加されているため、正常に動作します。
変更不可能な変数と🔗定数はいくらか似ていますが、定数として使用することはできますか?
Shadowing#
Cairo の Shadowing は Rust と似ており、異なる変数が同じ変数名を使用する効果を実現できます。具体的な例を見てみましょう:
use debug::PrintTrait;
fn main() {
let mut x = 5_u32;
let x: felt252 = 10;
{
// 中括弧内の変数にのみ影響を与え、外側の変数には影響を与えません
let x = x * 2;
'Inner scope x value is:'.print();
x.print()
}
'Outer scope x value is:'.print();
x.print();
}
上記の例では、let x: felt252 = 10;
で定義された x 変数は、前の行の x を完全に上書きします。これが Shadowing という名前の由来です。次の特徴があります:
- let キーワードを使用して再定義します。
- 再定義では、以前の型とは関係なく、異なるデータ型を使用できます。
- Shadowing は同じ名前空間内の変数にのみ影響を与えます。
- 変数が immutable であろうと mutable であろうと、shadowed されることができます。
注意⚠️:Shadowing を使用する際には、異なる名前空間で同じ変数名を使用することを避けるようにしてください。これにより、バグの特定が困難になる可能性があります。