Menu
CoddyTech

切片作为函数参数

本课属于 Coddy Rust 学习旅程的“逻辑与流程”单元。第 56 课,共 66 课。

编写处理字符串的函数时,将 &str 而不是 String 用作参数类型,可以让函数更加灵活实用。

接受 String 参数的函数只能接受拥有所有权的字符串,这限制了你调用它的方式:

fn print_message(text: String) {
    println!("{}", text);
}

// 这样可以运行,但会转移所有权
let my_string = String::from("Hello");
print_message(my_string); // 之后就不能再使用 my_string 了

不过,接受 &str 的函数既可以接受对 String 的引用,也可以接受字符串字面量,因此用途更加广泛:

fn print_message(text: &str) {
    println!("{}", text);
}

// 现在你可以用这两种类型中的任意一种来调用它
let my_string = String::from("Hello");
print_message(&my_string); // 传入 String 的引用
print_message("World");     // 直接传入字符串字面量

这种灵活性意味着,你的函数可以适用于更多场景,而不必强迫调用方转换数据或放弃对数据的所有权。

challenge icon

挑战

简单

你会收到两个输入。第一个输入是一条文本消息,第二个输入是这条消息允许的最大长度。创建一个名为 truncate_message 的函数,它接受字符串切片(&str)和最大长度(usize)作为参数。如果消息长度超过最大长度,函数应返回消息中从开头到最大长度的切片。否则,返回整条消息。打印结果。

要求:

  • 读取第一个输入(文本消息)并去除空白
  • 读取第二个输入(最大长度)并去除空白
  • 将最大长度解析为 usize
  • 定义一个名为 truncate_message 的函数,它接受两个参数:
    • 表示消息的字符串切片 &str
    • 表示最大长度的 usize
  • 在函数内部,检查消息长度是否大于最大长度
  • 如果是,使用 &message[0..max_len] 返回从索引 0 到最大长度的消息切片
  • 如果不是,返回整条消息
  • 使用输入的消息和最大长度调用该函数
  • 打印返回的结果

输入:

  • 第一行:一条文本消息(例如,Hello World from Rust)
  • 第二行:作为数字输入的最大长度(例如,11)

输出:

  • 如果消息超过最大长度,则输出截断后的消息;否则输出完整消息

亲手试试

use std::io;

// TODO: 在这里定义 truncate_message 函数


fn main() {
    // 读取文本消息
    let mut message = String::new();
    io::stdin().read_line(&mut message).expect("Failed to read line");
    let message = message.trim();
    
    // 读取最大长度
    let mut max_length_input = String::new();
    io::stdin().read_line(&mut max_length_input).expect("Failed to read line");
    let max_len: usize = max_length_input.trim().parse().expect("Invalid number");
    
    // TODO: 调用 truncate_message 函数并保存结果
    
    // TODO: 输出结果
}
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: Rust 在线编译器