Добавить объявление

Rust: как сделать функции для работы со строками более гибкими

В одном из прошлых постов мы разобрали, почему &str лучше String для чтения данных. Теперь пойдем дальше и сделаем наши функции еще более универсальными!

Пример из прошлого поста:


fn print_text(text: &str) { // Используем ссылку на строку
println!("{}", text);
}

let my_string = String::from("hello");
print_text(&my_string); // Передаем ссылку

let string_literal = "hello";
print_text(string_literal); // Работает и со строковыми литералами

Более гибкое решение:


fn print_text(text: impl AsRef) {
println!("{}", text.as_ref());
}

// Использование
print_text("hello"); // Строковый литерал

let my_string = String::from("world");
print_text(my_string); // String без ссылки

let owned_string = String::from("text");
print_text(&owned_string); // Сылка на String

Как работает:


AsRef это трайт (trait), который говорит, что функция принимает любой тип, который можно превратить в &str. Компилятор сам делает это преобразование с помощью .as_ref() когда нужно.
27.11.2025 15 198