LINUX.ORG.RU

История изменений

Исправление FishHook, (текущая версия) :

те самые трейты, предоставляющие полиморфизм, но не настолько мощный, как в C++/Java/Eiffel

В расте, если я все правильно понимаю, всё нормально с динамическим полиморфизмом:

fn dynamic_dispatch(p: &dyn Printer) {
    p.print();
}

по-моему, ничем принципиально не отличается от виртуальных методов С++, ТВМы устроены немного по-другому, синтаксис другой, ну а по сути тоже самое.

Поэтому какой-то ООП в Rust есть.

Да самый настоящий ООП. Непривычный просто. Наследование? В расте есть более мощная штука, можно имплементировать дефолтное поведение для трейта, и специфицировать дефолт для конкретной реализации, в принципе тоже наследование

struct Point {
    x: i32,
    y: i32
}

struct Square {
    left_up: Point,
    right_bottom: Point
}
struct Triangle {
    a: Point,
    b: Point,
    c: Point,
}

fn distance(a: &Point, b: &Point) -> f64 {
    (((a.x - b.x ).pow(2) + (a.y - b.y).pow(2)) as f64).sqrt()
}

trait Polygon {
    fn get_lines(&self) -> Vec<(Point, Point)>;
    fn perimetr(&self) -> f64 {
        self.get_lines().into_iter().map(|l| distance(&l.0, &l.1)).sum()
    }

}

impl Polygon for Square {
    fn get_lines(&self) -> Vec<(Point, Point)> {
        ...
    }
}

impl Polygon for Triangle {
    fn get_lines(&self) -> Vec<(Point, Point)> {
        ...
    }
}

Исходная версия FishHook, :

те самые трейты, предоставляющие полиморфизм, но не настолько мощный, как в C++/Java/Eiffel

В расте, если я все правильно понимаю, всё нормально с динамическим полиморфизмом:

fn dynamic_dispatch(p: &dyn Printer) {
    p.print();
}

по-моему, ничем принципиально не отличается от виртуальных методов С++, ТВМы устроены немного по-другому, синтаксис другой, ну а по сути тоже самое.

Поэтому какой-то ООП в Rust есть. Да самый настоящий ООП. Непривычный просто. Наследование? В расте есть более мощная штука, можно имплементировать дефолтное поведение для трейта, и специфицировать дефолт для конкретной реализации, в принципе тоже наследование

struct Point {
    x: i32,
    y: i32
}

struct Square {
    left_up: Point,
    right_bottom: Point
}
struct Triangle {
    a: Point,
    b: Point,
    c: Point,
}

fn distance(a: &Point, b: &Point) -> f64 {
    (((a.x - b.x ).pow(2) + (a.y - b.y).pow(2)) as f64).sqrt()
}

trait Polygon {
    fn get_lines(&self) -> Vec<(Point, Point)>;
    fn perimetr(&self) -> f64 {
        self.get_lines().into_iter().map(|l| distance(&l.0, &l.1)).sum()
    }

}

impl Polygon for Square {
    fn get_lines(&self) -> Vec<(Point, Point)> {
        ...
    }
}

impl Polygon for Triangle {
    fn get_lines(&self) -> Vec<(Point, Point)> {
        ...
    }
}