[TOC]
类型系统概述
什么是类型?类型是对二进制数据的一种约束行为。类型比起直接使用二进制数据,有许多优势:
- 减少开发者心智负担
- 安全
- 容易优化
常见的类型分类:
- 静态类型:在编译期对类型进行检查
- 动态类型:在运行期对类型进行检查
- 强类型:不允许隐式类型转换
- 弱类型:允许进行隐式类型转换
C 语言由于允许隐式类型转换因此是静态弱类型语言,许多人易将 C 语言误认为静态强类型,需要特别注意:
代码语言:javascript复制int main() {
long a = 10;
return a;
}
- Rust 是静态强类型语言
变量和可变性
创建和使用变量
在 Rust 代码中,可以使用 let
关键字将值绑定到变量:
fn main() {
let x = 5;
println!("The value of x is: {}", x);
}
println
是一个宏,它是最常用的将数据打印在屏幕上的方法。目前,我们可以简单地将它视为一个拥有可变参数数量的函数,在后面的章节中我们会对宏进行详细的讨论。
可变性
在 Rust 中,变量默认是不可变的,一旦一个值绑定到一个名称,就不能更改该值:
代码语言:javascript复制fn main() {
let x = 5;
println!("The value of x is: {}", x);
x = 6; // cannot assign twice to immutable variable `x`
println!("The value of x is: {}", x);
}
但有时候允许变量可变是非常有用的。通过在变量名前面添加 mut
来使它们可变:
fn main() {
let mut x = 5;
println!("The value of x is: {}", x);
x = 6;
println!("The value of x is: {}", x);
}
常量和变量
不可变变量容易让你联想到另一个概念:常量。在 Rust 中,常量使用 const
定义,而变量使用 let
定义:
- 不允许对常量使用修饰词
mut
,常量始终是不可变的 - 必须显示标注常量的类型
- 常量可以在任何作用域中声明,包括全局作用域
- 常量只能设置为常量表达式,而不能设置为函数调用的结果或只能在运行时计算的任何其他值
const A_CONST: i32 = 1;
隐藏(Shadowing)
可以声明一个与前一个变量同名的新变量,并且新变量会隐藏前一个变量,这种操作被称为隐藏(Shadowing)。
代码语言:javascript复制fn main() {
let x = 5;
let x = x 1;
let x = x * 2;
println!("The value of x is: {}", x);
}
基础数据类型
Rust 是一门静态编程语言,所有变量的类型必须在编译期就被明确固定。
整数
Rust 中有 12 种不同的整数类型:
长度 | 有符号 | 无符号 |
---|---|---|
8-bit | i8 | u8 |
16-bit | i16 | u16 |
32-bit | i32 | u32 |
64-bit | i64 | u64 |
128-bit | i128 | u128 |
arch | isize | usize |
- 对于未明确标注类型的整数,Rust 默认采用 i32.
- isize 和 usize 根据系统的不同而有不同的长度.
浮点数
Rust 有两种浮点数类型,为 f32
和 f64
,后者精度更高。对于未明确标注类型的小数,Rust 默认采用 f64
.
fn main() {
let x = 2.0; // f64
let y: f32 = 3.0; // f32
}
布尔值
与大多数其他编程语言一样,Rust 中的布尔类型有两个可能的值:true
和 false
。布尔值的大小是一个字节。
fn main() {
let t = true;
let f: bool = false;
}
字符
Rust 支持单个字符,字符使用单引号包装。
代码语言:javascript复制fn main() {
let c = 'z';
let z = 'ℤ';
let heart_eyed_cat = '