Menu
Coddy logo textTech

Введение в блоки реализации

Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 1 из 61.

В Rust структуры определяют, какие данные содержит тип, но они не определяют, что этот тип может делать. Чтобы наделить структуру поведением, мы используем блоки реализации с ключевым словом impl.

Блок реализации связывает функции (называемые методами) с конкретной структурой. Вот базовая структура:

struct Dog {
    name: String,
    age: u8,
}

impl Dog {
    fn bark(&self) {
        println!("{} says woof!", self.name);
    }
}

Блок impl Dog сообщает Rust, что всё внутри него относится к структуре Dog. Такое разделение позволяет сохранять определение данных чистым, в то же время позволяя добавлять столько методов, сколько необходимо, в блоке реализации.

Чтобы вызвать метод, используйте точечную нотацию для экземпляра:

fn main() {
    let my_dog = Dog {
        name: String::from("Rex"),
        age: 3,
    };
    
    my_dog.bark(); // Вывод: Rex says woof!
}

Этот паттерн разделения данных (struct) и поведения (блок impl) является фундаментальным для организации кода на Rust. В следующих уроках мы изучим, как методы получают доступ к данным структуры через параметр &self, который вы видите в примере выше.

challenge icon

Задание

Легко

Создайте структуру Cat с двумя полями: name (String) и lives (u8).

Добавьте блок реализации для Cat с методом под названием meow, который принимает &self и выводит имя кошки, за которым следует " says meow!".

Вы получите два входных значения:

  • Первая строка: имя кошки (String)
  • Вторая строка: количество жизней (u8)

Создайте экземпляр Cat с предоставленными значениями и вызовите у него метод meow.

Ожидаемый формат вывода:

{name} says meow!

Шпаргалка

Блоки реализации связывают методы со структурами с помощью ключевого слова impl:

struct Dog {
    name: String,
    age: u8,
}

impl Dog {
    fn bark(&self) {
        println!("{} says woof!", self.name);
    }
}

Блок impl отделяет определение данных (структуру) от поведения (методов). Методы вызываются с использованием точечной нотации:

let my_dog = Dog {
    name: String::from("Rex"),
    age: 3,
};

my_dog.bark(); // Вывод: Rex says woof!

Методы используют параметр &self для доступа к данным структуры.

Попробуйте сами

use std::io;

// TODO: Определите структуру Cat с полями 'name' (String) и 'lives' (u8)


// TODO: Добавьте блок реализации для Cat с методом 'meow'


fn main() {
    let mut name = String::new();
    io::stdin().read_line(&mut name).expect("Failed to read line");
    let name = name.trim().to_string();
    
    let mut lives_input = String::new();
    io::stdin().read_line(&mut lives_input).expect("Failed to read line");
    let lives: u8 = lives_input.trim().parse().expect("Failed to parse lives");
    
    // TODO: Создайте экземпляр Cat и вызовите метод meow
    
}
quiz iconПроверьте себя

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

Все уроки раздела Object Oriented Programming