切片作为函数参数
本课属于 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"); // 直接传入字符串字面量这种灵活性意味着,你的函数可以适用于更多场景,而不必强迫调用方转换数据或放弃对数据的所有权。
挑战
简单你会收到两个输入。第一个输入是一条文本消息,第二个输入是这条消息允许的最大长度。创建一个名为 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: 输出结果
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Rust 在线编译器