Срезы как параметры функций
Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 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для максимальной длины
- Срез строки
- Внутри функции проверьте, превышает ли длина сообщения максимальную длину
- Если да, верните срез сообщения от индекса 0 до максимальной длины, используя
&message[0..max_len] - Если нет, верните всё сообщение целиком
- Вызовите функцию, передав ей введенное сообщение и максимальную длину
- Выведите полученный результат
Ввод:
- Первая строка: Текстовое сообщение (например,
Hello World from Rust) - Вторая строка: Максимальная длина в виде числа (например,
11)
Вывод:
- Усеченное сообщение, если оно превышает максимальную длину, или полное сообщение в противном случае
Шпаргалка
Использование &str в качестве типа параметра делает функции более гибкими, чем использование String, так как они могут принимать как ссылки на строки, так и строковые литералы:
fn print_message(text: &str) {
println!("{}", text);
}
let my_string = String::from("Hello");
print_message(&my_string); // Передача ссылки на String
print_message("World"); // Передача строкового литерала напрямуюЧтобы вернуть срез строки до определенной длины, используйте синтаксис срезов:
&message[0..max_len]Попробуйте сами
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: Выведите результат
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутое управление потоком выполнения
Выражение 'match'Сопоставление нескольких значенийСопоставление диапазоновВыражение 'if let'Циклы как выраженияИтоги — Простой парсер команд4Группировка данных с помощью структур
Что такое структура?Обзор структурДоступ к полям структурыИзменяемые структурыСтруктуры как параметры функцийКортежные структурыИтоги: создание структуры Book7Обработка ошибок с помощью 'Result'
Что такое 'Result'?Использование 'match' с 'Result'is_ok() и is_err()Сокращения: unwrap и expectОператор вопросительного знака '?'Парсинг строк в числаИтоги: функция безопасного деления10Замыкания и анонимные функции
Что такое замыкание?Определение простого замыканияЗамыкания с параметрамиЗахват окруженияИтоги: Простое замыкание-сумматор2Введение в векторы
Что такое вектор?Создание вектораДобавление элементов с помощью pushДоступ к элементам вектораИтерация по векторуИзменяемая итерацияУдаление элементовИтоги — Простой счетчик очков5Пары «ключ-значение» в Hash Map
Что такое Hash Map?Создание Hash MapВставка пар «ключ-значение»Доступ к значениямИтерация по Hash MapОбновление значенияУдаление парыИтоги — Счетчик слов8Проект: Простой инвентарь товаров
Настройка проектаДобавление товараПроверка наличияПродажа товараСобираем всё воедино3Список дел в командной строке
Настройка проектаДобавление задачиПросмотр всех задачУдаление задачиИтоговый код6Обработка отсутствия значения с 'Option'
Что такое 'Option'?Использование 'match' с 'Option'is_some() и is_none()Распаковка 'Option'Метод expectЗначение по умолчанию: unwrap_orИтоги: поиск элемента9Срезы строк и не только
String и &strСоздание срезов строкСрезы как параметры функцийДругие срезыИтоги: поиск первого слова