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浮点数(小数)
Section titled “浮点数(小数)”带小数点的数要用浮点类型。浮点类型有两种: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,有权限:falsechar 存放单个字符,用单引号 ' ' 来写。Rust 的 char 可以是任意一个 Unicode 标量值,这涵盖了大部分 emoji;不过少数复杂的 emoji(比如国旗,或者由多个字符组合而成的 emoji)没法放进一个 char。
fn main() { let letter = 'R'; let symbol = '$'; let crab = '🦀'; println!("{letter} {symbol} {crab}");}输出:
R $ 🦀字符串(文字)
Section titled “字符串(文字)”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"); |
1. 玩家资料
Section titled “1. 玩家资料”用每种类型各一个变量来描述一个游戏角色:名字(&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 | 段位 A2. 拼出一句话
Section titled “2. 拼出一句话”从 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
- 数据类型 —《Rust 程序设计语言》:每种标量类型的大小和取值范围,还有整数溢出,以及复合类型(元组和数组)。
- 原生类型 —《通过例子学 Rust》:每种基本类型的可运行示例,后续还有一节讲
1_000、0x80这类字面量。 i32— 标准库文档(英文):最小值和最大值(i32::MIN、i32::MAX),以及数字的各种方法。char— 标准库文档(英文):什么是 Unicode 标量值,以及为什么char总是占 4 个字节。String— 标准库文档(英文):String和&str的关系,以及构建和修改文字的所有方法。