访问值
本课属于 Coddy Rust 学习旅程的“逻辑与流程”单元。第 30 课,共 66 课。
将数据存储在哈希映射中后,你需要一种方法来获取数据。.get() 方法可以让你使用键查找值:
let value = my_map.get("some_key");不过,有一个重要细节需要了解:.get() 不会直接返回值,而是会返回 Option 类型。这是 Rust 的内置类型,表示“有值”或“没有值”。这是因为你要查找的键可能不存在于哈希映射中。
当键存在时,.get() 会返回 Some(&value)。注意 & 符号,它表示你得到的是值的引用,而不是值本身。当键不存在时,它会返回 None:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}你可能会注意到,匹配分支使用了 Some(capital),没有显式写出 &。这是因为在这种情况下,Rust 会自动为你处理引用:capital 仍然持有对该值的引用,但你不需要在模式中显式写出 &。Rust 的模式匹配足够智能,你可以直接使用 capital,例如打印它时。
这种设计可以防止你在尝试访问不存在的键时程序崩溃。Rust 不会让程序出错,而是要求你处理两种情况:找到值或找不到值。这样能让你的代码更稳健,也更容易预测。
挑战
简单你会收到两个输入:一个国家名称和一个首都名称。创建一个哈希映射,将国家名称作为键(类型为 String),将首都名称作为值(类型为 String)。把国家及其首都插入哈希映射。然后,你会收到第三个输入,其中包含另一个要查询的国家名称。使用 .get() 方法获取该国家的首都,并处理两种情况:国家存在于映射中,以及国家不存在于映射中。
注意:.get() 会返回一个 Option:键存在时返回 Some(&value)(对值的引用),键不存在时返回 None。在 match 分支中,你可以写 Some(capital),Rust 会自动处理引用,因此你可以在打印语句中直接使用 capital。
要求:
- 从
std::collections导入HashMap - 创建一个类型为
HashMap<String, String>的可变哈希映射 - 读取第一行输入作为国家名称
- 读取第二行输入作为首都名称
- 把国家及其首都插入哈希映射
- 读取第三行输入作为要查询的国家名称
- 使用
.get()获取要查询国家的首都 - 使用
match处理.get()返回的Option - 如果找到该国家,打印:
The capital of [country] is [capital] - 如果没有找到该国家,打印:
[country] not found in the map
输入:
- 第一行:要插入的国家名称(例如,
France) - 第二行:首都名称(例如,
Paris) - 第三行:要查询的国家名称(例如,
France或Germany)
输出:
- 如果要查询的国家存在:
The capital of [country] is [capital] - 如果要查询的国家不存在:
[country] not found in the map
亲手试试
use std::collections::HashMap;
use std::io;
fn main() {
// 读取要插入的国家名称
let mut country = String::new();
io::stdin().read_line(&mut country).expect("Failed to read line");
let country = country.trim().to_string();
// 读取首都名称
let mut capital = String::new();
io::stdin().read_line(&mut capital).expect("Failed to read line");
let capital = capital.trim().to_string();
// 读取要查询的国家名称
let mut lookup_country = String::new();
io::stdin().read_line(&mut lookup_country).expect("Failed to read line");
let lookup_country = lookup_country.trim().to_string();
// TODO:在下方编写你的代码
// 创建一个 HashMap,插入国家及其首都,然后查询该国家
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Rust 在线编译器