Параметр Self
Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 2 из 61.
Когда методу необходимо получить доступ к данным, хранящимся в экземпляре структуры, он использует параметр &self. Этот специальный параметр всегда является первым аргументом в методе и представляет собой ссылку на экземпляр, для которого вызывается метод.
Символ & означает, что мы заимствуем экземпляр, а не берем на себя владение им. Это позволяет методу читать поля структуры, не поглощая экземпляр:
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
fn is_square(&self) -> bool {
self.width == self.height
}
}
Внутри тела метода self предоставляет вам доступ ко всем полям структуры с помощью точечной нотации. Метод area считывает значения как width, так и height для вычисления и возврата результата.
Поскольку &self только заимствует экземпляр, вы можете вызывать несколько методов одной и той же структуры без каких-либо проблем:
fn main() {
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
}
Методы, использующие &self, предназначены только для чтения — они могут просматривать данные структуры, но не могут их изменять. В следующем уроке вы узнаете, как создавать методы, которые могут изменять экземпляр.
Задание
ЛегкоСоздайте структуру Circle с одним полем: radius (f64).
Добавьте блок реализации для Circle с двумя методами, которые используют &self:
circumference— возвращает длину окружности какf64(формула:2.0 * 3.14159 * radius)diameter— возвращает диаметр какf64(формула:2.0 * radius)
Вы получите на вход одно значение:
- Радиус круга (f64)
Создайте экземпляр Circle с указанным радиусом, затем выведите длину окружности и диаметр на отдельных строках.
Ожидаемый формат вывода:
{circumference}
{diameter}Шпаргалка
Методы получают доступ к данным структуры с помощью параметра &self, который должен быть первым аргументом. Символ & означает, что метод заимствует экземпляр, а не принимает владение им:
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
fn is_square(&self) -> bool {
self.width == self.height
}
}
Внутри метода используйте self с точечной нотацией для доступа к полям структуры. Методы с &self предназначены только для чтения и могут изучать данные, но не изменять их.
Поскольку &self только заимствует экземпляр, вы можете вызывать несколько методов для одной и той же структуры:
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
Попробуйте сами
use std::io;
// TODO: Определите структуру Circle здесь
// TODO: Добавьте блок реализации для Circle с методами circumference и diameter
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let radius: f64 = input.trim().parse().expect("Invalid number");
// TODO: Создайте экземпляр Circle и выведите длину окружности и диаметр
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media Player