Rust(1) - Variable, Mutability and Constant
討論一下 Rust 中 Mutability 和 Constant 的用法。
1. Mutability:
Rust 變數分成可變的跟不可變的,舉個例子:
fn main() { let n = 199; println!("n: {}", n); n = n + 1; println!("n: {}", n); }
Rust 預設變數是不可變的。上面我們定義了一個不可變的變數 n ,編譯時編譯器會報錯 cannot assign twice to immutable variable
利用 mut 關鍵字宣告變數:
fn main() { let mut n = 199; println!("n: {}", n); n = n + 1; println!("n: {}", n); }
2. 變數型別:
宣告時可以寫明變數的型別,如果沒寫編譯器會自行推導。
下面宣告一個變數 n ,型別為 unsigned int 8 (8 bits)。Rust 的數字有 8, 16, 32, 64 等長度。
fn main() { let n: u8 = 199; println!("n: {}", n); }
Rust 可以在 compile 時檢查數值是否超出範圍,i8 最大為 127 所以編譯時會報錯。
fn main() { let n: i8 = 199; println!("n: {}", n); }
3. Shadowing:
Shadowing 類似重新綁定的功能,imutable 可以透過 shadowing 將變數內容重新綁定。
use std::any::type_name; fn print_type_of<T>(_: &T) { println!("{}", type_name::<T>()) } fn main() { // imutable let x = 5; println!("x: {}", x); print_type_of(&x); let x = 6.1; println!("x: {}", x); print_type_of(&x); }
執行結果如下,綁定後是不同型別的物件。
x: 5 i32 x: 6.1 f64
4. Constant 和 imutable 的差別:
Constant 和 imutable 的差別是 constant 可以在編譯時決定,但 imutable 通常是 runtime 決定。
use rand::Rng; fn main() { const PI: f32 = 3.14; let var = do_somethong(); println!("PI: {}, var: {}", PI, var); } fn do_somethong() -> f32 { let mut rng = rand::thread_rng(); rng.gen_range(0.0, 10.0) }
imutable 可以確保變數在使用者的地方被重新綁定,減少可能造成的 bug。
留言
張貼留言