Rust 语言变量的使用
要点:
- Rust 运行环境介绍
- Rust 变量类型声明
- Rust 可变类型
- Rust 常量
Rust 运行环境
学习一门新的语言建议从在线编程环境入手,因为这样可以快速上手,熟悉语法要素,而不必纠结开发环境。Rust 语言官方编程环境:https://play.rust-lang.org/。
不过在线编程也有缺点:无法自动补全、自动缩进、格式化代码、无法处理多个源文件。Rust 语言安装也是非常简便:https://www.rust-lang.org/tools/install。
建议B站找个视频,一下子就学会了。
Rust 变量基本用法
Rust 语言变量的基本使用如下:
fn main() {
let an_integer = 1u32;
let a_boolean = true;
let unit = ();
println!("An integer: {:?}", an_integer);
println!("A boolean: {:?}", a_boolean);
println!("Meet the unit value: {:?}", unit);
}
从上面的例子可以看出 Rust 语言使用 let
关键字声明变量,不过 Rust 语言更喜欢把变量的声明过程称为绑定。
💡 在 println!
中使用 {:?}
打印调试信息。
Rust 变量类型声明
上面的展示的例子没有写出变量的类型,其实我们用到了 Rust 语言的类型推导功能,它可以从变量的值反推变量的类型。
fn main(){
let an_integer: u32 = 1u32;
let a_boolean: bool = true;
let unit: () = ();
let numbers: Vec<i32>= vec![1,2,3,4];
println!("An integer: {:?}", an_integer);
println!("A boolean: {:?}", a_boolean);
println!("Meet the unit value: {:?}", unit);
println!("Numbers: {:?}", numbers);
}
这个例子演示了如何给变量添加类型,并且给出了 Rust 一种常见容器 Vec
的用法,<i32>
是泛型绑定,可以这么理解:Vec
容器可以装不同类型的数据,例如:整数、浮点数、结构体、元组,这里我们需要装 i32
的整数,因此指定为 <i32>
。
Rust 可变类型
对于上述代码,我们做出如下一点改动:
fn main(){
let an_integer: u32 = 1u32;
an_integer += 1;
println!("An integer: {:?}", an_integer);
}
编译就会报错:
2 | let an_integer: u32 = 1u32;
| ----------
| |
| first assignment to `an_integer`
| help: consider making this binding mutable: `mut an_integer`
3 |
4 | an_integer +=1;
| ^^^^^^^^^^^^^^ cannot assign twice to immutable variable
编译器告诉我们需要把 an_integer
绑定为可变的 mut an_integer
。修改为:
fn main(){
let mut an_integer: u32 = 1u32;
an_integer += 1;
println!("An integer: {:?}", an_integer);
}
💡 理解变量赋值。
编程语言的赋值符号 =
一般有两层含义:
(1)读取等号右边的值;
(2)把右边的值写到左边变量绑定的内存里。
这样简单的一读一写其实是细思极恐的问题,在并发条件下会造成数据竞争,可能得到多种结果。Rust 这样设计的目的是能不变的数据尽量绑定为不可变。
重新绑定
一个变量名可以被多次绑定:
fn main() {
let x = 5;
println!("The value of x is: {}", x);
let x = "Hello";
println!("The value of x is: {}", x);
}
后面的绑定会遮盖(shadow)前面的绑定,类型与值都可以重新绑定。
常量
// Globals are declared outside all other scopes.
static LANGUAGE: &str = "Rust";
const THRESHOLD: i32 = 10;
fn is_big(n: i32) -> bool {
// Access constant in some function
n > THRESHOLD
}
fn main() {
let n = 16;
// Access constant in the main thread
println!("This is {}", LANGUAGE);
println!("The threshold is {}", THRESHOLD);
println!("{} is {}", n, if is_big(n) { "big" } else { "small" });
// Error! Cannot modify a `const`.
THRESHOLD = 5;
// FIXME ^ Comment out this line
}
const
与 static
都有贯穿于整个程序的生命周期,他们的区别是:
const
没有固定的内存地址,实际上它们会被内联到用到它们的地方,为此对同一常量的引用并不能保证引用到相同的内存地址。static
在使用时并不内联,这意味着对每一个值只有一个实例,并且位于内存中的固定位置,是全局性的。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: