Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust中不可变变量和常量变量之间的区别是什么?_Rust_Constants_Immutability - Fatal编程技术网

Rust中不可变变量和常量变量之间的区别是什么?

Rust中不可变变量和常量变量之间的区别是什么?,rust,constants,immutability,Rust,Constants,Immutability,我了解到,如果一个变量没有使用mut显式地声明为可变的,它将变为不可变的(声明后不能更改)。那么为什么我们在Rust中有const关键字呢?他们不一样吗?如果没有,它们有什么区别呢?const用于编译时常量以及所需的所有内容。例如,您可以创建一个大小为常量的固定大小数组,但不能使用let绑定。当然,这也意味着您可以在let绑定中放入比在const中多得多的内容const不适用于变量;它适用于不可能存储在任何地方的常量值;它们实际上是文字值的别名 非mut让声明一个实际变量,该变量在运行时创建,可

我了解到,如果一个变量没有使用
mut
显式地声明为可变的,它将变为不可变的(声明后不能更改)。那么为什么我们在Rust中有
const
关键字呢?他们不一样吗?如果没有,它们有什么区别呢?

const
用于编译时常量以及所需的所有内容。例如,您可以创建一个大小为
常量的固定大小数组,但不能使用
let
绑定。当然,这也意味着您可以在
let
绑定中放入比在
const
中多得多的内容
const
不适用于变量;它适用于不可能存储在任何地方的常量值;它们实际上是文字值的别名


mut
声明一个实际变量,该变量在运行时创建,可以移动(并且不再可访问),在某些情况下甚至具有内部可变性(例如,如果它包含
单元格
成员)。

常量不能重新定义:

let x = 10u32;
const Y:u32 = 20u32;

let x = 11u32;
//error: duplicate definition of value `Y` [E0428]
//const Y:u32 = 21u32;

println!("x={} Y={}",x,Y); //x=11 Y=20

const
,在Rust中是常量的缩写,与编译时计算有关。它显示:

  • 声明常量时:
    constfoo:usize=3
  • 声明编译时可计算函数时:
    const fn foo()->&'static str
这些类型的值可以用作通用参数:
[u8;FOO]
。目前,这仅限于阵列大小,但有传言、计划,并希望在未来进一步扩展

相比之下,
let
绑定是关于运行时计算的值

注意,尽管由于易变性的概念是众所周知的,所以使用了
mut
,但锈实际上就在这里
&T
&mut T
是关于别名,而不是可变性:

  • &T
    :共享参考
  • &mut T T
    :唯一引用
最值得注意的是,某些类型具有内部可变性,可以通过
&T
(共享引用):
单元格
参照单元格
互斥体
等进行变异



注意:
mut
const
与原始指针(
*mut
*const T
)有一种替代用法,这里没有讨论。

此外,我们不能使用let生成全局项,但可以使用const。这里有一个例子

const LENGTH:usize = 4;

fn main() {
    let arr:[i32; LENGTH] = [10,20,30,40];

    for i in 0..LENGTH{
        println!("{}", arr[i])
    }
}

有关const、static和let用法的更多信息:


故事稍微长一点。

a
const
不代表内存位置,而是一个值<代码>常量
值直接内联在使用位置。在表达式求值期间创建的任何临时对象都只能由编译器在编译时访问。可以全局地确定范围。无法引用运行时项目。必须是带类型注释的

让值表示内存位置。
let
绑定的不变性是编译器强制执行的,可以使用
mut
修饰符更改。它是运行时构造。总是在局部范围内。编译器可以推断它们的类型

为完整起见,
static
也表示类似let的内存位置,但对相同static的任何引用实际上都是对相同内存位置的引用。静态是静态的。它们被编译成可执行文件,并可在运行程序的整个生命周期内访问。可以全局地确定范围。可以引用其他静力学。必须进行类型注释。

常规术语为“阴影”(代替“重新定义”)-这是原始指针的用法,这里也提到了它但这并不容易做到。