Menu
CoddyTech

访问值

本课属于 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 不会让程序出错,而是要求你处理两种情况:找到值或找不到值。这样能让你的代码更稳健,也更容易预测。

challenge icon

挑战

简单

你会收到两个输入:一个国家名称和一个首都名称。创建一个哈希映射,将国家名称作为键(类型为 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,插入国家及其首都,然后查询该国家
    
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Rust 在线编译器