目录
本章节介绍编程语言中一些通用的,rust中也存在的概念。例如:变量、基础类型、函数、注释、控制流 。这些是Rust语言的基石。
像其他编程语言一样,Rust同样包含一组预留的关键词集合。定义变量或函数名时不能使用这些预留关键词。一部分关键词是已定义包含特殊语义的token,另一部分是预留以后使用的。
1. 变量和可变(可修改)性
默认定义中,变量是不可变的。 这个是Rust与其它编程语言极大的区别之一,该特性使得rust在安全性和并发编程中具有优势。但仍然可以通过使用mut 关键词使变量可修改。
变量不可变,意味着不能改变该变量的值。如下代码,通过cargo new varibales创建的rust工程。
// src/main.rs
fn main() {
let x = 5;
println!("The value of x is: {}", x);
x = 6;
println!("The value of x is: {}", x);
}
cargo构建会报编译错误,如下:
# cargo build Compiling variables v0.1.0 (/doc/jiangxiaoqing/rust/chapter3/variables) error[E0384]: cannot assign twice to immutable variable `x` --> src/main.rs:5:5 | 3 | let x = 5; | - | | | first assignment to `x` | help: consider making this binding mutable: `mut x` 4 | println!("The value of x is: {}", x); 5 | x = 6; | ^^^^^ cannot assign twice to immutable variable For more information about this error, try `rustc --explain E0384`. error: could not compile `variables` due to previous error
无法对不可变变量x进行二次赋值操作。
Rust编程语言设计思想认为:应该区分不可变和可变变量,从而减少运行时不同代码或线程误操作修改变量而引起bug的发生。这种bug通常是难以追踪和定位的,因此Rust在编译时即可做到检查此种类型的不安全操作。
Rust编译器确保对不可变变量声明后,该变量不会发生值变更。(如何做到?编译期间记录并追踪每一个变量符号的不可变性以及修改操作?)
通过将变量声明成mut的可变类型,可以使得变量可变,可变变量意义重大。指定mut实际提示变量的读写方,其它的代码可能会随时改变变量的值。
fn main() {
// let x = 5;
let mut x = 5;
println!("The value of x is: {}", x);
x = 6;
println!("The value of x is: {}", x);
}
不可变变量的设计和使用除了要考虑了“容易引入bug”的问题,也考虑了其它方面的折中。使用大型数据结构的情况下,就地更改实例可能比复制和返回新分配的实例更快,不宜使用不可变类型;对于更小的数据结构,直接创建新的变量实例,以函数式的编程风格更容易被接受,获得这种清晰性比起降低些许性能的代价是值得的。
-
const定义的常量
常量和不可变变量有区别:
1)常量不能用mut修饰,永不可变
2)用const而非用let来定义常量
3)常量类型在定义时必须指定,不能省略
4)常量定义时赋值,且必须是常量表达式
按照rust的惯例,常量名用大写,如下:
const THREE_HOURS_IN_SECONDS:u32 = 60 * 60 * 3;
println!("The const value is: {}", THREE_HOURS_IN_SECONDS);
-
变量作用域和变量覆盖
如同C++语言,rust变量在也存在{}内作用域变量,此外,相同作用域中同名变量,后者会覆盖前者。
let y = 5;
let y = y + 1;
{
let y = y * 2;
println!("The value of y in the inner scope is: {}", y);
}
println!("The value of y is: {}", y);
let spaces = " ";
// change variable type
let spaces = spaces.len();
变量覆盖不同于mut可变变量,变量覆盖是定义新变量,且可以更改同名新变量的类型。
整体代码如下:
fn main() {
// let x = 5;
let mut x = 5;
println!("The value of x is: {}", x);
x = 6;
println!("The value of x is: {}", x);
const THREE_HOURS_IN_SECONDS:u32 = 60 * 60 * 3;
println!("The const value is: {}", THREE_HOURS_IN_SECONDS);
let y = 5;
let y = y + 1;
{
let y = y * 2;
println!("The value of y in the inner scope is: {}", y);
}
println!("The value of y is: {}", y);
let spaces = " ";
// change variable type
let spaces = spaces.len();
println!("The value of spaces is: {}", spaces);
}
关于作者:
犇叔,浙江大学计算机科学与技术专业,研究生毕业,而立有余。先后在华为、阿里巴巴和字节跳动,从事技术研发工作,资深研发专家。主要研究领域包括虚拟化、分布式技术和存储系统(包括CPU与计算、GPU异构计算、分布式块存储、分布式数据库等领域)、高性能RDMA网络协议和数据中心应用、Linux内核等方向。
专业方向爱好:数学、科学技术应用
关注犇叔,期望为您带来更多科研领域的知识和产业应用。
内容坚持原创,坚持干货有料。坚持长期创作,关注犇叔不迷路