String и &str
Владение текстом
«String и &str» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.
Owned vs Borrowed Text
Rust разделяет владение текстом на два типа:
String— владеет своими данными в куче.&str— заимствует представление текста, которым не владеет.
fn main() {
let owned = String::from("I own this");
let borrowed: &str = "I am borrowed";
println!("{} / {}", owned, borrowed);
}Where the Data Lives
Тип String хранит свои байты в куче и может изменять размер. Строковый литерал &str зашит в бинарный код программы и имеет фиксированный размер.
fn main() {
let mut heap = String::from("grows");
heap.push_str(" bigger");
let fixed = "never changes";
println!("{} | {}", heap, fixed);
}Ownership Means Responsibility
Владелец String освобождает занимаемую ею память, когда переменная выходит из области видимости. &str не владеет ничем, поэтому он никогда ничего не освобождает.
fn main() {
{
let s = String::from("temporary");
println!("{}", s);
} // s is dropped and its memory freed here
println!("done");
}Borrowing a String
Вы можете заимствовать String как &str с помощью &. String по-прежнему владеет данными; срез лишь предоставляет взгляд на них.
fn main() {
let owned = String::from("shared text");
let view: &str = &owned;
println!("{} / {}", owned, view);
}Moving a String
Присваивание String другой переменной перемещает право владения. Исходную переменную больше нельзя использовать.
fn main() {
let a = String::from("hello");
let b = a; // ownership moves to b
// println!("{}", a); // would error: a was moved
println!("{}", b);
}Cloning to Keep Both
Если вам нужны две независимые владеющие строки, используйте clone для копирования данных.
fn main() {
let a = String::from("hello");
let b = a.clone();
println!("{} and {}", a, b);
}Copying a &str Is Cheap
&str — это просто указатель и длина, поэтому его копирование не копирует сам текст. Он реализует Copy.
fn main() {
let original = "data";
let copy = original; // both still valid
println!("{} {}", original, copy);
}Functions and Ownership
Передача String по значению перемещает её в функцию. Передача &str или &String лишь заимствует значение, позволяя вызывающему коду использовать его в дальнейшем.
fn length(s: &str) -> usize {
s.len()
}
fn main() {
let text = String::from("measure me");
println!("{}", length(&text));
println!("still here: {}", text);
}Returning Owned Strings
Когда функции необходимо создать новый текст, она возвращает владеющий String, чтобы вызывающий код получил право владения.
fn make_greeting(name: &str) -> String {
format!("Hello, {}!", name)
}
fn main() {
let g = make_greeting("Rust");
println!("{}", g);
}Choosing the Right Type
Рекомендации:
- Текст принадлежит структуре? Используйте
String. - Нужно только прочитать или передать текст? Используйте
&str. - Функция создает новый текст? Возвращайте
String.
fn first_word(s: &str) -> &str {
s.split_whitespace().next().unwrap_or("")
}
fn main() {
let sentence = String::from("learn rust today");
println!("{}", first_word(&sentence));
}Why the Distinction Matters
Такое разделение позволяет Rust избегать ненужного копирования и гарантирует безопасность памяти без использования сборщика мусора. Вы всегда знаете, кто владеет фрагментом текста.
fn main() {
let owned = String::from("safe");
let borrowed = &owned[..];
println!("owner {} borrows {}", owned, borrowed);
}Quick Check
Вспомните, что происходит при перемещении строки (String).
Recap
Владение String и &str:
Stringвладеет данными в куче и освобождает их при уничтожении (drop).&strссылается на существующий текст и не владеет им.- Перемещение (move)
Stringделает исходную переменную недействительной;cloneсоздаёт копию. - Принимайте
&strдля чтения, возвращайтеStringдля создания нового текста.
fn shout(s: &str) -> String {
s.to_uppercase()
}
fn main() {
let name = String::from("rust");
let loud = shout(&name);
println!("{} -> {}", name, loud);
}Часто задаваемые вопросы
Урок «String и &str» бесплатный?
Да — полный текст урока «String и &str» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.
Чему я научусь в уроке «String и &str»?
Владение текстом Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn Rust Coding?
Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «String и &str»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn Rust Coding?
Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- String и &str
- Срезы
- Методы строк
- UTF-8 и символы