Статическая диспетчеризация в Rust: методы и примеры

Фраза «armanriazi•rust•concept•static•dispatch» представляет собой комбинацию слов, относящихся к языку программирования Rust и концепции статической диспетчеризации. Статическая диспетчеризация относится к процессу определения конкретной реализации функции или метода во время компиляции, а не во время выполнения. В некоторых случаях это может привести к повышению производительности.

Вот несколько методов в Rust, демонстрирующих статическую отправку:

  1. Использование дженериков:
    fn add<T>(a: T, b: T) -> T
    where
    T: std::ops::Add<Output = T>,
    {
    a + b
    }
    fn main() {
    let result = add(5, 10);
    println!("Result: {}", result);
    }

В этом примере функция addиспользует дженерики, чтобы включить статическую отправку для добавления. Параметр типа Tреализует признак Add, который позволяет использовать оператор +. Компилятор будет специализировать функцию addдля каждого используемого типа, обеспечивая статическую отправку.

  1. Использование объектов-характеристик:
    trait Shape {
    fn area(&self) -> f64;
    }
    struct Rectangle {
    width: f64,
    height: f64,
    }
    impl Shape for Rectangle {
    fn area(&self) -> f64 {
        self.width * self.height
    }
    }
    fn print_area(shape: &dyn Shape) {
    println!("Area: {}", shape.area());
    }
    fn main() {
    let rectangle = Rectangle {
        width: 5.0,
        height: 10.0,
    };
    print_area(&rectangle);
    }

В этом примере мы определяем признак Shapeи реализуем его для структуры Rectangle. Функция print_areaпринимает объект типажа (&dyn Shape) в качестве параметра, что позволяет ему принимать любой тип, реализующий признак Shape. Компилятор выполнит статическую отправку на основе фактического типа объекта, переданного в print_area.