主要是Rust语言圣经学习的小结,供参考
基本概念
rust
// Rust 程序入口函数,跟其它语言一样,都是 main,该函数目前无返回值
fn main() {
// 使用let来声明变量,进行绑定,a是不可变的
// 此处没有指定a的类型,编译器会默认根据a的值为a推断类型:i32,有符号32位整数
// 语句的末尾必须以分号结尾
let a = 10;
// 主动指定b的类型为i32
let b: i32 = 20;
// 这里有两点值得注意:
// 1. 可以在数值中带上类型:30i32表示数值是30,类型是i32
// 2. c是可变的,mut是mutable的缩写
let mut c = 30i32;
// 还能在数值和类型中间添加一个下划线,让可读性更好
let d = 30_i32;
// 跟其它语言一样,可以使用一个函数的返回值来作为另一个函数的参数
let e = add(add(a, b), add(c, d));
// println!是宏调用,看起来像是函数但是它返回的是宏定义的代码块
// 该函数将指定的格式化字符串输出到标准输出中(控制台)
// {}是占位符,在具体执行过程中,会把e的值代入进来
println!("( a + b ) + ( c + d ) = {}", e);
}
// 定义一个函数,输入两个i32类型的32位有符号整数,返回它们的和
fn add(i: i32, j: i32) -> i32 {
// 返回相加值,这里可以省略return
i + j
}
变量可变性
- 其他大多数语言,要么只支持声明可变的变量,要么只支持声明不可变的变量;Rust两者都要,既要灵活,又要安全。
- 默认不可变,让代码安全,性能更好。
- 通过
mut
让变量变为可变。 - 常量与不可变变量,常量用const修饰。
变量绑定
- 例如
let a = "hello world"
,变量绑定不同与其他语言的变量赋值,是与Rust的内存管理方法相关的。 - 绑定可有较复杂的形式,如解构,
let (a, mut b):(bool, bool)=(true,false);
- 变量遮蔽,一方面类似于C&C++或Python中的变量作用域;另一方面,不同类型的变量可以同名;
基本类型
- Rust一般能自动推导出变量类型,因此可省略类型,但能力有边界,如
let guess = "42".parse().expect("Not a number!");
需要明确指定,"42".parse::<i32>
或let guess: i32 = ...
- 字符、布尔、单元类型。单元是
()
,这是main()、println!()等函数的返回值。
语句与表达式
Rust语言区分语句与表达式。表达式不能含分号;表达式一旦加上分号,就会变成语句,不会返回值。
rust
fn add_with_extra(x: i32, y: i32) -> i32 {
let x = x + 1; // 语句
let y = y + 5; // 语句
x + y // 表达式
}
函数
Rust是强类型语言,每个函数参数都要明确标出具体类型。
函数可使用表达式或return作为返回值。
特殊函数:返回()的函数,永不返回发散函数,
rust
fn forever() -> ! {
loop {
//...
};
}
所有权
计算机语言内存管理的三种方式:自动回收、手动管理、所有权管理。
我粗略地理解,Rust语言将基本数据类型及其组合,放在栈上管理,不存在所有权转移,执行浅拷贝,这样的变量称为有Copy的特征,"一个旧的变量在被赋值给其他变量后仍然可用";而对于堆上的变量,则有所有权规则;对于堆上的变量,Rust语言的绑定右值类似于Python的浅拷贝,同时使得左值失效,又有移动的内涵。