基本概念
Rust语言中的标量类型主要包括四类:整数类型、浮点数类型、布尔类型和字符类型。每种类型都有其特定的特点和用途。下面是每种标量类型的详细解释和示例代码:
1. 整数类型 (Integer Types)
整数类型表示没有小数部分的数字。Rust 支持多种整数类型,每种类型的存储大小不同。整数类型分为有符号和无符号两种。有符号整数(如i32)可以表示正数、负数和零,而无符号整数(如u32)只能表示非负数。
特点
- 有符号整数类型:
i8,i16,i32,i64,i128,isize - 无符号整数类型:
u8,u16,u32,u64,u128,usize isize和usize是根据平台的不同(32位或64位)来确定其位宽的。
示例代码
fn main() {
let x: i32 = -42; // 有符号32位整数
let y: u32 = 42; // 无符号32位整数
println!("x = {}, y = {}", x, y);
}
2. 浮点数类型 (Floating-Point Types)
浮点数类型表示具有小数部分的数字。Rust 支持两种浮点数类型:f32 和 f64。它们分别对应 32 位和 64 位的 IEEE-754 标准。
特点
f32: 32位单精度浮点数f64: 64位双精度浮点数(默认)
示例代码
fn main() {
let x: f32 = 3.14; // 32位浮点数
let y: f64 = 2.718281828459045; // 64位浮点数
println!("x = {}, y = {}", x, y);
}
3. 布尔类型 (Boolean Type)
布尔类型表示真或假的值。布尔类型在Rust中用bool表示,值为true或false。
特点
- 只有两个值:
true和false
示例代码
fn main() {
let is_rust_fun: bool = true;
let is_rust_hard: bool = false;
println!("Is Rust fun? {}", is_rust_fun);
println!("Is Rust hard? {}", is_rust_hard);
}
4. 字符类型 (Character Type)
字符类型表示单个 Unicode 字符,在 Rust 中用 char 表示,占用 4 个字节,可以表示所有的 Unicode 值。
特点
- 占用 4 个字节(32 位)
- 可以表示所有的 Unicode 字符
示例代码
fn main() {
let c1: char = 'A';
let c2: char = '中';
let c3: char = '🚀';
println!("c1 = {}, c2 = {}, c3 = {}", c1, c2, c3);
}
Rust中的默认类型选择
在 Rust 中,当不显式指定类型时,编译器会根据上下文和默认规则来推断标量类型。以下是 Rust 对各种标量类型的默认选择:
1. 整数类型
对于整数类型,Rust 默认选择 i32(32 位有符号整数)。这是因为 i32 在大多数情况下提供了足够的范围和性能。
fn main() {
let x = 42; // x 被推断为 i32
println!("x = {}", x);
}
在上面的代码中,x 默认被推断为 i32 类型。
2. 浮点数类型
对于浮点数类型,Rust 默认选择 f64(64 位双精度浮点数)。这是因为 f64 提供了更高的精度和更广泛的范围,适用于大多数场景。
fn main() {
let y = 3.14; // y 被推断为 f64
println!("y = {}", y);
}
在上面的代码中,y 默认被推断为 f64 类型。
3. 布尔类型
布尔类型没有默认的推断类型,因为 bool 类型只能是 true 或 false,不需要推断。
fn main() {
let is_rust_fun = true; // is_rust_fun 被推断为 bool
println!("Is Rust fun? {}", is_rust_fun);
}
在上面的代码中,is_rust_fun 被推断为 bool 类型。
4. 字符类型
字符类型 char 也没有默认的推断类型,因为 char 类型的字面量(例如 'A')只能表示 char 类型。
fn main() {
let c = 'A'; // c 被推断为 char
println!("c = {}", c);
}
在上面的代码中,c 被推断为 char 类型。
总结
当不显式指定类型时,Rust 会根据上下文和默认规则推断类型:
- 整数类型默认
i32 - 浮点数类型默认
f64 - 布尔类型和字符类型根据字面量直接推断为
bool和char,无需额外推断。