02_Cairo 中の定数#
この記事で使用されている Cairo コンパイラのバージョン:2.0.0-rc0。Cairo は急速に更新されているため、異なるバージョンの構文がわずかに異なる場合がありますが、将来的には安定したバージョンに記事の内容を更新する予定です。
基本的な使い方#
use debug::PrintTrait;
const ONE_HOUR_IN_SECONDS: felt252 = 3600;
fn main(){
ONE_HOUR_IN_SECONDS.print();
}
const キーワードを使用し、定数の型を指定し、最後に定数の値を指定します。
不変変数との違い#
定数には以下の特性があります:
- mut キーワードを使用することはできません。
- グローバルスコープでのみ宣言できます。
- 定数にはリテラルのみを使用して値を割り当てることができます。
関数内で定数を宣言してみましょう。
use debug::PrintTrait;
fn main(){
const ONE_HOUR_IN_SECONDS: felt252 = 3600;
ONE_HOUR_IN_SECONDS.print();
}
このように書くと、たくさんのエラーが表示されます🙅。
非リテラルの値を使用するとエラーが発生します。
use debug::PrintTrait;
const TEST: felt252 = 3600;
const ONE_HOUR_IN_SECONDS: felt252 = TEST;
fn main(){
ONE_HOUR_IN_SECONDS.print();
}
上記のコードでは、1 つの定数を別の定数に割り当てることを試みていますが、次のエラーが表示されます。
error: Only literal constants are currently supported.
--> d_const.cairo:4:38
const ONE_HOUR_IN_SECONDS: felt252 = test;
^**^
変数と定数のまとめ#
Cairo では、変数の宣言はデフォルトで「不変」です。これは非常に興味深いです。他の主要な言語では、変数の宣言はデフォルトで変更可能ですが、Cairo では逆になります。これは理解できます。通常、「不変」はより安定性があり、変更可能性は不安定性をもたらすからです。したがって、Cairo はより安全な言語になりたいと考えているのでしょう。さらに、Cairo には const
修飾子があります。したがって、Cairo では次のようなことができます:
- 定数:
const LEN:u32 = 1024;
ここでのLEN
はu32
の整数定数(符号なし 32 ビット整数)です。これはコンパイル時に使用されます。 - 変更可能な変数:
let mut x = 5;
これは他の言語と同様です。実行時に使用されます。 - 不変の変数:
let x = 5;
このような変数は変更できませんが、let x = x + 10;
のように新しいx
を再定義することはできます。これは Cairo では Shadowing と呼ばれます。2 番目のx
は最初のx
を覆い隠しています。
Cairo の Shadowing は、使用する際に問題を引き起こす可能性があります。同じ名前の変数を使用すると(ネストされたスコープ環境内で)、バグが発生する可能性があります。一般的には、各変数には最適な名前があるため、重複することは避けるべきです。
デフォルトの不変の利点#
不変の変数は、プログラムの安定した実行に役立ちます。これはプログラミングの「契約」であり、不変の変数を処理するときにプログラムは安定し、特にマルチスレッドの環境では、不変性は読み取り専用を意味します。
その他の利点は、変更可能なオブジェクトと比較して、理解しやすく、推論しやすく、より高いセキュリティを提供します。このような「契約」があると、コンパイラはコンパイル時に多くのプログラミング上の問題をチェックすることが容易になります。これが Cairo 言語のコンパイラが多くのプログラミング上の問題をチェックできる理由です。