Menu
Coddy logo textTech

Параметр 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, предназначены только для чтения — они могут просматривать данные структуры, но не могут их изменять. В следующем уроке вы узнаете, как создавать методы, которые могут изменять экземпляр.

challenge icon

Задание

Легко

Создайте структуру 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 и выведите длину окружности и диаметр
    
}
quiz iconПроверьте себя

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

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