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 協議》,轉載必須註明作者和本文連結