rust-quiz:003-mutate-const.rs

godme發表於2022-07-07
struct S {
    x: i32,
}

const S: S = S { x: 2 };

fn main() {
    let v = &mut S;
    v.x += 1;
    S.x += 1;
    print!("{}{}", v.x, S.x);
}

const

對於const,我們所知的是
- 宣告必須帶型別標記
- 常量,不能被修改

但還值的注意的一點是,常量更主要的行為特徵,就是把預先定義的數值回填到指定的位置。

變數覆蓋

對於同名的變數,它總是去的和它最近的優先與當次宣告的值。

名稱空間

對於一個值的歸屬,是有明確的解析的。

  • 針對型別的值的讀取,歸於型別持有。
  • 針對變數的值的讀取,歸於變數持有。

因此,對於一個變數的讀取,它總是有明確且唯一的解析空間。

本題中的struct S其實已經被const S所覆蓋,針對const的替換特性,本題可轉換為

struct S {
    x: i32,
}

fn main() {
    let v = &mut S { x: 2 };
    v.x += 1;
    S { x: 2 }.x += 1;
    print!("{}{}", v.x, S { x: 2 }.x);
}

對於v.x,初始化的值為2,後續+1,因此v.x的值是3
S.x,作為常量,它的值始終是2
其中S {x : 2}.x += 1可以看做是宣告瞭一個初始化和v等同的值,但是後續廢棄。
整體類似於

struct S {
    x: i32,
}

fn main() {
    let v = &mut S { x: 2 };
    v.x += 1;
    let vv = &mut S{ x: 2};
    vv.x += 1;
    print!("{}{}", v.x, S { x: 2 }.x);
}

因此,列印結果為32

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章