跳转到内容

Rust 数据类型

Rust 里的每个值都有一个类型(type),它是一个标签,告诉编译器这是哪种数据(整数、小数、文字、真/假等等)。知道了类型,Rust 就能在程序运行之前检查代码里的错误。

就像你在变量一页看到的那样,Rust 通常能帮你推断类型。不过最好还是记住主要类型的名字,因为它们会出现在错误信息和函数签名里。

整数是没有小数点的数,比如 42 或 -7。Rust 有好几种整数类型,区别在于大小以及能不能表示负数:

类型 有符号? 常见用途
i32 是(可以是负数) 默认类型,没有特别理由就用它
u32 否(0 及以上) 计数、大小等不可能为负的值
i64 / u64 是 / 否 非常大的数
usize 否 集合的索引
fn main() {
let temperature = -5; // 默认是 i32
let count: u32 = 100; // 显式指定为无符号整数
println!("{temperature} 度,计数是 {count}");
}

输出:

-5 度,计数是 100
▶ 动手试一试

带小数点的数要用浮点类型。浮点类型有两种:f64(默认,双精度)和 f32。

fn main() {
let pi = 3.14159; // 默认是 f64
let price: f32 = 9.99;
println!("圆周率是 {pi},价格是 {price}");
}

输出:

圆周率是 3.14159,价格是 9.99
▶ 动手试一试

除非你确实需要更小的 f32,否则就用 f64:它更精确,而且在现代硬件上一样快。

布尔值(bool)是最简单的类型:要么是 true,要么是 false。在 if 语句和各种条件里,你会经常用到它。

fn main() {
let is_logged_in = true;
let has_permission: bool = false;
println!("已登录:{is_logged_in},有权限:{has_permission}");
}

输出:

已登录:true,有权限:false
▶ 动手试一试

char 存放单个字符,用单引号 ' ' 来写。Rust 的 char 可以是任意一个 Unicode 标量值,这涵盖了大部分 emoji;不过少数复杂的 emoji(比如国旗,或者由多个字符组合而成的 emoji)没法放进一个 char。

fn main() {
let letter = 'R';
let symbol = '$';
let crab = '🦀';
println!("{letter} {symbol} {crab}");
}

输出:

R $ 🦀
▶ 动手试一试

Rust 里的文字用双引号来写。你会遇到两种字符串类型:

  • &str:字符串 slice,通常是直接写在代码里的文字(也就是“字符串字面量”)。
  • String:一段可以增长、拥有所有权的文字,可以修改,也可以一点点拼接起来。
fn main() {
let greeting = "你好"; // &str
let mut name = String::from("Ferris"); // String
name.push_str(" 小螃蟹"); // String 可以增长
println!("{greeting},{name}!");
}

输出:

你好,Ferris 小螃蟹!
▶ 动手试一试

现在还不用纠结 &str 和 String 的区别,这和你很快就会学到的所有权有关。目前只要记住:文字用 "..." 来写,需要拼接或修改时就用 String。

大多数时候 Rust 都会推断类型。但有时它需要一点提示,比如把文字解析成数字的时候(你会在类型转换一页看到)。添加类型的方法是写一个冒号:

let x: i32 = 42;
let y: f64 = 3.5;
let active: bool = true;
类型 存放什么 示例
i32 整数(默认) let n = 42;
u32 非负整数 let n: u32 = 42;
f64 小数(默认) let pi = 3.14;
bool true 或 false let ok = true;
char 一个字符 let c = 'A';
&str 文字字面量 let s = "hi";
String 可以增长的文字 let s = String::from("hi");

用每种类型各一个变量来描述一个游戏角色:名字(&str)、等级(i32)、生命值百分比(f64)、是否在线 is_online(bool)和段位字母(char)。把它们全部打印在一行里。提示:char 用单引号,文字用双引号。

查看答案
fn main() {
let name = "Ferris"; // &str
let level = 7; // i32
let health = 82.5; // f64
let is_online = true; // bool
let rank = 'A'; // char
println!("{name} | 等级 {level} | {health}% | 在线:{is_online} | 段位 {rank}");
}

输出:

Ferris | 等级 7 | 82.5% | 在线:true | 段位 A
▶ 动手试一试

从 String::from("Rust") 开始,依次往后加上 " 很快" 和 ",也很安全",然后打印结果。提示:String 必须用 mut 声明,push_str 才能修改它。

查看答案
fn main() {
let mut sentence = String::from("Rust");
sentence.push_str(" 很快");
sentence.push_str(",也很安全");
println!("{sentence}");
}

输出:

Rust 很快,也很安全
▶ 动手试一试
  • 每个值都有一个类型;Rust 通常会自动推断。
  • 整数 → i32(默认)。小数 → f64(默认)。
  • bool 是 true/false;char 是用单引号括起来的单个字符。
  • 文字用双引号来写:字面量是 &str,可以增长的文字用 String。

小测验

1. 如果不指定类型,Rust 默认的整数类型是什么?

2. Rust 怎样区分 char 字面量和字符串字面量?

3. 哪种类型是可以增长、拥有所有权、能够修改的文字?

4. Rust 默认的浮点类型是什么?

5. let greeting = "Hello"; 会被推断成哪种类型?

得分: 0 / 5