7_R*_*R3X 33 const immutability rust
我了解到,如果变量未使用显式声明为可变mut,则变为不可变(在声明后不能更改).那为什么我们const在Rust中有关键字?他们不一样吗?如果没有,它们有何不同?
Mat*_* M. 28
const在Rust中,是常量的缩写,与编译时评估有关.它显示:
const FOO: usize = 3;const fn foo() -> &'static str这些类型的值可以用作通用参数:[u8; FOO].目前这仅限于阵列大小,但有谈话,计划,并希望将来进一步扩展.
相反,let绑定约为运行时计算值.
请注意,尽管mut因为可变性的概念众所周知而被使用,但Rust实际上就在这里.&T并且&mut T是关于别名,而不是可变性:
&T:共享参考&mut T:独特的参考最值得注意的是,某些类型具有内部的可变性,并且可以通过突变&T(共享引用): ,,Cell 等.RefCellMutex
注意:有一个替代使用mut和const使用原始指针(*mut T和*const T),这里不讨论.
aSp*_*pex 16
常量不能被遮蔽:
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
Run Code Online (Sandbox Code Playgroud)
Chr*_*son 14
const不是变量; 这是恒定值,可能无法存储在任何地方; 它们实际上是字面值的别名.
非mut let声明在运行时创建的实际变量,可以移动(并且不再可访问),甚至Cell在某些情况下具有内部可变性(例如,如果它包含成员).
Aconst不代表内存位置,而是一个值。const值直接内联在使用位置。在表达式计算期间创建的任何临时对象只能在编译期间由编译器访问。可以全局作用域。无法引用运行时项。必须进行类型注释。
让值代表一个内存位置。let绑定的不变性是编译器强制执行的事情,可以使用mut修饰符进行更改。它是运行时构造。始终在本地范围内。它们的类型可以由编译器推断出来。
为完整起见, astatic也代表一个内存位置,如 let 但任何对相同静态的引用实际上是对同一内存位置的引用。静态是静态的。它们被编译成可执行文件,并且在运行程序的整个生命周期内都可以访问。可以全局作用域。可以参考其他静态。必须进行类型注释。
小智 5
此外,我们不能使用let制作全局项,但可以使用const。这是一个例子。
const LENGTH:usize = 4;
fn main() {
let arr:[i32; LENGTH] = [10,20,30,40];
for i in 0..LENGTH{
println!("{}", arr[i])
}
}
Run Code Online (Sandbox Code Playgroud)
有关const、static和let用法的更多信息:
const和static
故事有点长。
| 归档时间: |
|
| 查看次数: |
5474 次 |
| 最近记录: |