Rust有一个用`const`关键字定义常量的方法:
~~~
const N: i32 = 5;
~~~
与[let](http://doc.rust-lang.org/nightly/book/variable-bindings.html)绑定不同,你必须标注一个`const`的类型。
常量贯穿于整个程序的生命周期。更具体的,Rust中的常量并没有固定的内存地址。这是因为实际上它们会被内联到用到它们的地方。为此对同一常量的引用并不能保证引用到相同的内存地址。
## `static`
Rust以静态量的方式提供了类似“全局变量”的功能。它们与常量类似,不过静态量在使用时并不内联。这意味着对每一个值只有一个实例,并且位于内存中的固定位置。
这是一个栗子:
~~~
static N: i32 = 5;
~~~
与[let](http://doc.rust-lang.org/nightly/book/variable-bindings.html)绑定不同,你必须标注一个`static`的类型。
静态量贯穿于整个程序的生命周期,因此任何存储在常量中的引用有一个[`’static`生命周期](http://doc.rust-lang.org/nightly/book/lifetimes.html):
~~~
static NAME: &'static str = "Steve";
~~~
## 可变性
你可以用`mut`关键字引入可变性:
~~~
static mut N: i32 = 5;
~~~
因为这是可变的,一个线程可能在更新`N`同时另一个在读取它,导致内存不安全。因此访问和改变一个`static mut`是[不安全(unsafe)](http://doc.rust-lang.org/nightly/book/unsafe.html)的,因此必须在`unsafe`块中操作:
~~~
unsafe {
N += 1;
println!("N: {}", N);
}
~~~
更进一步,任何存储在`static`的类型必须实现`Sync`。
## 初始化
`const`和`static`都要求赋予它们一个值。它们只能被赋予一个常量表达式的值。换句话说,你不能用一个函数调用的返回值或任何相似的复合值或在运行时赋值。
## 我应该用哪个?(Which construct should I use?)
几乎所有时候,如果你可以在两者之间选择,选择`const`。实际上你很少需要你的常量关联一个内存位置,而且使用常量允许你不止在在自己的包装箱还可以在下游包装箱中使用像常数扩散这样的优化。
一个常量可以看作一个C中的`#define`:它有元数据开销但无运行时开销。“我应该在C中用一个#define或者一个static呢?”大体上与在Rust你应该用常量还是静态量是一个问题。
- 前言
- 1.介绍
- 2.准备
- 2.1.安装Rust
- 2.2.Hello, world!
- 2.3.Hello, Cargo!
- 3.学习Rust
- 3.1.猜猜看
- 3.2.哲学家就餐问题
- 3.3.其它语言中的Rust
- 4.高效Rust
- 4.1.栈和堆
- 4.2.测试
- 4.3.条件编译
- 4.4.文档
- 4.5.迭代器
- 4.6.并发
- 4.7.错误处理
- 4.8.外部语言接口
- 4.9.Borrow 和 AsRef
- 4.10.发布途径
- 5.语法和语义
- 5.1.变量绑定
- 5.2.函数
- 5.3.原生类型
- 5.4.注释
- 5.5.If语句
- 5.6.for循环
- 5.7.while循环
- 5.8.所有权
- 5.9.引用和借用
- 5.10.生命周期
- 5.11.可变性
- 5.12.结构体
- 5.13.枚举
- 5.14.匹配
- 5.15.模式
- 5.16.方法语法
- 5.17.Vectors
- 5.18.字符串
- 5.19.泛型
- 5.20.Traits
- 5.21.Drop
- 5.22.if let
- 5.23.trait对象
- 5.24.闭包
- 5.25.通用函数调用语法
- 5.26.包装箱和模块
- 5.27.`const`和`static`
- 5.28.属性
- 5.29.`type`别名
- 5.30.类型转换
- 5.31.关联类型
- 5.32.不定长类型
- 5.33.运算符和重载
- 5.34.`Deref`强制多态
- 5.35.宏
- 5.36.裸指针
- 6.Rust开发版
- 6.1.编译器插件
- 6.2.内联汇编
- 6.3.不使用标准库
- 6.4.固有功能
- 6.5.语言项
- 6.6.链接参数
- 6.7.基准测试
- 6.8.装箱语法和模式
- 6.9.切片模式
- 6.10.关联常量
- 7.词汇表
- 8.学院派研究
- 勘误