Изменяемое взятие в долг в книге по Rust

RustRustBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном задании мы исследуем изменяемость в Rust, изучая концепцию взятия данных в долг с использованием изменяемых и неизменяемых ссылок на примере структуры book с функциями, демонстрирующими поведение изменяемого и неизменяемого взятия в долг.

Примечание: Если в лабораторном задании не указано имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать main.rs, скомпилировать и запустить его с помощью команды rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/BasicConceptsGroup -.-> rust/mutable_variables("Mutable Variables") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/DataTypesGroup -.-> rust/type_casting("Type Conversion and Casting") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") subgraph Lab Skills rust/variable_declarations -.-> lab-99199{{"Изменяемое взятие в долг в книге по Rust"}} rust/mutable_variables -.-> lab-99199{{"Изменяемое взятие в долг в книге по Rust"}} rust/integer_types -.-> lab-99199{{"Изменяемое взятие в долг в книге по Rust"}} rust/string_type -.-> lab-99199{{"Изменяемое взятие в долг в книге по Rust"}} rust/type_casting -.-> lab-99199{{"Изменяемое взятие в долг в книге по Rust"}} rust/function_syntax -.-> lab-99199{{"Изменяемое взятие в долг в книге по Rust"}} rust/expressions_statements -.-> lab-99199{{"Изменяемое взятие в долг в книге по Rust"}} end

Изменяемость

Изменяемые данные можно взять в изменяемом долге с использованием &mut T. Это называется изменяемой ссылкой и дает доступ на чтение и запись для заемщика. В отличие от этого, &T берет данные в неизменяемом долге, и заемщик может читать данные, но не модифицировать их:

#[allow(dead_code)]
#[derive(Clone, Copy)]
struct Book {
    // `&'static str` - это ссылка на строку, выделенную в памяти с атрибутом read only
    author: &'static str,
    title: &'static str,
    year: u32,
}

// Эта функция принимает ссылку на книгу
fn borrow_book(book: &Book) {
    println!("Я взял в неизменяемом долге {} - {} издание", book.title, book.year);
}

// Эта функция принимает ссылку на изменяемую книгу и изменяет `year` на 2014
fn new_edition(book: &mut Book) {
    book.year = 2014;
    println!("Я взял в изменяемом долге {} - {} издание", book.title, book.year);
}

fn main() {
    // Создаем неизменяемую книгу под названием `immutabook`
    let immutabook = Book {
        // литералы строк имеют тип `&'static str`
        author: "Douglas Hofstadter",
        title: "Gödel, Escher, Bach",
        year: 1979,
    };

    // Создаем изменяемую копию `immutabook` и называем ее `mutabook`
    let mut mutabook = immutabook;

    // Взять в неизменяемом долге неизменяемый объект
    borrow_book(&immutabook);

    // Взять в неизменяемом долге изменяемый объект
    borrow_book(&mutabook);

    // Взять изменяемый объект в изменяемом долге
    new_edition(&mut mutabook);

    // Ошибка! Нельзя брать неизменяемый объект в изменяемом долге
    new_edition(&mut immutabook);
    // FIXME ^ Закомментируйте эту строку
}

Резюме

Поздравляем! Вы завершили лабораторную работу по Изменяемости. Вы можете практиковаться в других лабораторных работах в LabEx, чтобы улучшить свои навыки.