0Pricing
Learn Rust Coding · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. String и &str
  2. Срезы
  3. Методы строк
  4. UTF-8 и символы
← Назад к Learn Rust Coding