StarknetAstro

StarknetAstro

01_Cairo中的變數

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 這個名稱的由來。具有如下特徵:

  1. 使用 let 關鍵字進行重新定義;
  2. 重新定義可以使用不同的資料型別,與之前的型別無關;
  3. Shadowing 只影響同一命名空間中的變數;
  4. 無論變數是 immutable 還是 mutable,都可以被 shadowed,

注意⚠️:在使用 Shadowing 的時候,盡量避免在不同的命名空間使用相同的變數名,這樣會很難定位 bug。

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