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();
}
上述代碼使用一個常量給另一個常量賦值,會收到如下錯誤
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 ,第二個x
把第一個x
給遮蔽了。
對於 Cairo 的 Shadowing,使用起來可能會帶來麻煩。使用同名變量(在嵌套的 scope 環境下)帶來的 bug 還是很不好找的。一般來說,每個變量都應該有他最合適的名字,最好不要重名。
默認不可變的優勢#
不可變的變量對於程式的穩定運行是有幫助的,這是一種程式 “契約”,當處理契約為不可變的變量時,程式就可以穩定很多,尤其是多線程的環境下,因為不可變意味著只讀不寫。
其他好處是,與易變物件相比,它們更易於理解和推理,並提供更高的安全性。有了這樣的 “契約” 後,編譯器也很容易在編譯時查錯了。這就是 Cairo 語言的編譯器的編譯期可以幫你檢查很多程式上的問題。