Menu
Coddy logo textTech

Срезы как параметры функций

Часть раздела 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");     // Прямая передача строкового литерала

Эта гибкость означает, что ваши функции работают в большем количестве ситуаций, не заставляя вызывающую сторону преобразовывать свои данные или передавать владение.

challenge icon

Задание

Легко

Вы получите два входных значения. Первое — это текстовое сообщение, а второе — максимально допустимая длина сообщения. Создайте функцию с именем 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: Выведите результат
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow