Menu
Coddy logo textTech

Ассоциированные функции

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

Не все функции в блоке impl должны работать с существующим экземпляром. Функции, которые не принимают self в качестве параметра, называются ассоциированными функциями — они связаны с самим типом, а не с каким-либо конкретным экземпляром.

Наиболее распространенным использованием ассоциированных функций является создание конструкторов. По соглашению, их часто называют new:

struct Player {
    name: String,
    score: u32,
}

impl Player {
    fn new(name: String) -> Player {
        Player {
            name,
            score: 0,
        }
    }
}

Обратите внимание, что здесь нет параметра self — этой функции не требуется существующий Player для работы. Вместо этого она создает и возвращает новый экземпляр. Тип возвращаемого значения — сама структура.

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

fn main() {
    let player1 = Player::new(String::from("Alice"));
    
    println!("{} starts with {} points", player1.name, player1.score);
    // Вывод: Alice starts with 0 points
}

Этот паттерн предоставляет чистый способ инициализации структур со значениями по умолчанию или логикой валидации, сохраняя логику создания связанной с определением типа. Вы, вероятно, уже видели этот синтаксис с String::from() — это тоже ассоциированная функция!

challenge icon

Задание

Легко

Создайте структуру Book с двумя полями: title (String) и pages (u32).

Добавьте блок реализации для Book с ассоциированной функцией new, которая:

  • Принимает параметр title: String
  • Возвращает новый экземпляр Book с заданным заголовком и полем pages, установленным в 0

Также добавьте метод info, который принимает &self и возвращает String в формате: "{title} has {pages} pages"

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

  • Название книги (String)

Используйте ассоциированную функцию Book::new для создания книги с указанным названием, а затем выведите результат вызова метода info.

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

{title} has {pages} pages

Шпаргалка

Функции в блоке impl, которые не принимают self в качестве параметра, называются ассоциированными функциями. Они связаны с самим типом, а не с каким-либо конкретным экземпляром.

Ассоциированные функции часто используются в качестве конструкторов и обычно называются new:

struct Player {
    name: String,
    score: u32,
}

impl Player {
    fn new(name: String) -> Player {
        Player {
            name,
            score: 0,
        }
    }
}

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

let player1 = Player::new(String::from("Alice"));

String::from() — это пример ассоциированной функции, которую вы уже использовали.

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

use std::io;

// TODO: Определите структуру Book с полями title (String) и pages (u32)


// TODO: Добавьте блок impl для Book с:
// - Ассоциированной функцией `new`, которая принимает название и возвращает Book с количеством страниц, равным 0
// - Методом `info`, который возвращает String в формате "{title} has {pages} pages"


fn main() {
    let mut input = String::new();
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let title = input.trim().to_string();

    // TODO: Используйте Book::new для создания книги с указанным названием
    // TODO: Выведите результат вызова метода info
}
quiz iconПроверьте себя

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

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