rust-quiz:003-mutate-const.rs
题目
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 协议》,转载必须注明作者和本文链接
推荐文章: