РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
508 of 1245 menu

Тип Self

Тип Self в Rust используется внутри блоков impl и обозначает текущую структуру, для которой реализуется блок. Он позволяет обращаться к типу структуры без явного указания её имени. Это особенно удобно при работе с методами и ассоциированными функциями, так как позволяет избежать дублирования имени типа. Тип Self является сокращением для имени структуры, внутри которой он используется.

Синтаксис

impl StructName { fn method(&self) -> Self { // ... } }

Пример

Давайте создадим структуру Point и реализуем для неё метод, который возвращает новый экземпляр структуры, используя тип Self в качестве возвращаемого типа:

struct Point { x: i32, y: i32, } impl Point { fn new(x: i32, y: i32) -> Self { Self { x, y } } fn origin() -> Self { Self { x: 0, y: 0 } } } fn main() { let p1 = Point::new(1, 2); let p2 = Point::origin(); println!("p1: ({}, {})", p1.x, p1.y); println!("p2: ({}, {})", p2.x, p2.y); }

Результат выполнения кода:

p1: (1, 2) p2: (0, 0)

Пример

Давайте создадим структуру Counter и реализуем для неё метод, который возвращает новый экземпляр структуры с изменённым значением, используя тип Self в качестве типа параметра:

struct Counter { value: i32, } impl Counter { fn new(value: i32) -> Self { Self { value } } fn increment(&self) -> Self { Self { value: self.value + 1 } } } fn main() { let c1 = Counter::new(5); let c2 = c1.increment(); println!("c1: {}", c1.value); println!("c2: {}", c2.value); }

Результат выполнения кода:

c1: 5 c2: 6

Пример

Давайте создадим структуру Rectangle и реализуем для неё метод, который возвращает площадь прямоугольника, используя тип Self в ассоциированной функции:

struct Rectangle { width: f64, height: f64, } impl Rectangle { fn new(width: f64, height: f64) -> Self { Self { width, height } } fn square(size: f64) -> Self { Self { width: size, height: size } } fn area(&self) -> f64 { self.width * self.height } } fn main() { let rect = Rectangle::new(3.0, 4.0); let sq = Rectangle::square(5.0); println!("Rectangle area: {}", rect.area()); println!("Square area: {}", sq.area()); }

Результат выполнения кода:

Rectangle area: 12 Square area: 25

Смотрите также

  • ключевое слово impl,
    которое используется для реализации методов структуры
  • методы struct,
    которые позволяют добавлять поведение структурам
  • ассоциированные функции struct,
    которые связаны со структурой, но не принимают self
  • ссылка на себя self,
    которая используется для доступа к текущему экземпляру
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить