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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!