Тип 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