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。


留言

熱門文章