StarknetAstro

StarknetAstro

02_Cairo中的常量

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 關鍵字,並且指明了常量的類型,最後給出了常量的值。

與不可變變量的區別#

常量有以下性質:

  1. 不允許使用 mut 關鍵字
  2. 只能在全局範圍內聲明
  3. 只可以使用字面量給常量賦值

將常量聲明在函數中試試

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 語言的編譯器的編譯期可以幫你檢查很多程式上的問題。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。