Rust中的变量、遮蔽隐藏和常量

Rust 是一种静态的强类型语言。这意味着编译器必须在编译时知道所有变量的类型。编译器通常可以根据值以及我们如何使用它来推断我们想要使用什么类型。如果可能有多种类型,我们必须添加类型注释。

在本文中,我们将了解以下内容:

  • 变量和可变性
  • 影子
  • 常量

变量和可变性
让我们从理解变量和可变性开始。

让我们声明一个变量并打印它:

fn main() {
    let x = 5;
    println!("x is {}", x);
}

在这里,我们使用字符串插值来打印 x 的值。大括号是 x 值的占位符。然后 x 的值作为参数传递给 println!()。

类型的隐式声明:

  • 在编译时,Rust 推断 x 的类型为 i32。这是因为我们将值 3 分配给 x,并且除非另有指定,否则整数文字默认为 i32。

在 Rust 中,变量默认是不可变的。这意味着一旦我们为变量分配了值,就无法更改它。如果我们尝试更改变量的值,则会出现错误

fn main() {
    let x = 5;
    println!("x is {}", x);

    x = 6;
    println!("x is {}", x);
}

mut 关键字
如果我们想改变一个变量的值,我们必须将它声明为可变的。我们通过mut在变量名称之前添加关键字来实现此目的,如下所示:

fn main() {
    let mut x = 5;
    println!("x is {}", x);

    x = 6;
    println!("x is {}", x);
}

现在我们可以更改 x 的值而不会出现错误。

Shadow遮蔽
现在,让我们看看shadow遮蔽的概念。
我们可以通过shadowing遮蔽不可变变量的值来改变它。shadowing遮蔽是指我们声明一个与前一个变量同名的新变量。新变量遮蔽隐藏了前一个变量,我们可以为新变量分配新值,而旧变量保持不变。

fn main() {
    let x = 5;
    println!("x is {}", x);

    let x = 6;
    println!("x is {}", x);
}

你可能会认为我们会在这里出错,但事实并非如此。这是因为我们是在声明一个新变量,而不是改变旧变量的值。旧变量仍然存在,但新变量会对其产生影响。我们不能再使用旧变量,但可以使用新变量。

甚至可以使用前一个变量的值来初始化新变量:

fn main() {
    let x = 5;
    println!("x is {}", x);

    let x = x + 2;
    println!("x is {}", x);
}

不同作用域中的名称遮蔽
名称遮蔽Name shadowing是指我们声明一个与前一个变量同名的新变量。新变量会对前一个变量产生遮蔽,我们可以给新变量赋一个新值,而旧变量保持不变。

fn main() {
    let x = 5;
    println!("x is {}", x);

    {
        let x = 8;
        println!("x is {}", x);
    }

    let x = x + 2;
    println!("x is {}", x);
}

以上可正常运行

更改类型
使用遮蔽时,可以更改变量的类型。这是因为你是在声明一个新变量,而不是改变旧变量的值。

你可以用它来改变变量的类型:

fn main() {
    let x = 5;
    println!("x is {}", x);

    let x = "hello world!";
    println!("x is {}", x);
}

但如果对可变量不实现遮蔽处理,就无法更改变量的类型:

fn main() {
    let mut x = 5;
    println!("x is {}", x);

    x = "hello world!";
    println!("x is {}", x);
}

以上编译会错误

这意味着:

  • 如果我们使用遮蔽,就可以更改类型,
  • 但如果变量是可变的,我们就不能在不使用遮蔽的情况下更改类型。

常量示例
常量是不可变且具有固定值的变量。
它们是使用const` 关键字声明的。它们必须用类型进行注释,并且只能设置为常量表达式,而不是函数调用的结果或只能在运行时计算的任何其他值。

fn main() {
  const MAX_LEVEL:i32 = 100_000;
  println!("The maximum level is: {}", MAX_LEVEL);
}

回顾一下常量:

  • 您必须声明值的类型
  • 您必须为声明中的常量赋值
  • 你不能重新定义或改变常量(遮蔽shadow不起作用,不能使用mut关键字,不能重新分配)