Ассоциированные функции
Часть раздела 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() — это тоже ассоциированная функция!
Задание
ЛегкоСоздайте структуру 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
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media Player