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 的時候,盡量避免在不同的命名空間使用相同的變數名,這樣會很難定位 bug。