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

Текст «armanriazi•rust•static•vs•cons» представляет собой комбинацию ключевых слов, относящихся к языку программирования Rust и теме статического и динамического поведения. Поскольку неясно, какие именно методы или примеры вы ищете, я предоставлю общий обзор статического и динамического поведения в Rust и несколько примеров кода для иллюстрации концепций.

В Rust статическое и динамическое поведение относятся к различным способам обработки переменных и данных. Статическое поведение связано с решениями и оптимизацией во время компиляции, тогда как динамическое поведение предполагает решения и гибкость во время выполнения. Вот несколько методов и примеров кода, подчеркивающих различия:

  1. Статические переменные:

    static HELLO_WORLD: &str = "Hello, world!";
    fn main() {
       println!("{}", HELLO_WORLD);
    }

    В этом примере переменная HELLO_WORLDобъявлена ​​статической, то есть ее значение известно во время компиляции и не может быть изменено.

  2. Динамические переменные:

    fn main() {
       let hello_world = String::from("Hello, world!");
       println!("{}", hello_world);
    }

    Здесь переменная hello_worldобъявлена ​​как динамическая строка с использованием типа String. Его значение можно изменить во время выполнения.

  3. Статическая отправка (полиморфизм времени компиляции):

    trait Shape {
       fn area(&self) -> f64;
    }
    struct Circle {
       radius: f64,
    }
    impl Shape for Circle {
       fn area(&self) -> f64 {
           std::f64::consts::PI * self.radius * self.radius
       }
    }
    fn print_area(shape: &dyn Shape) {
       println!("Area: {}", shape.area());
    }
    fn main() {
       let circle = Circle { radius: 3.0 };
       print_area(&circle);
    }

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

  4. Динамическая отправка (полиморфизм времени выполнения):

    trait Animal {
       fn sound(&self);
    }
    struct Dog;
    struct Cat;
    impl Animal for Dog {
       fn sound(&self) {
           println!("Woof!");
       }
    }
    impl Animal for Cat {
       fn sound(&self) {
           println!("Meow!");
       }
    }
    fn main() {
       let animals: Vec<Box<dyn Animal>> = vec![Box::new(Dog), Box::new(Cat)];
       for animal in animals {
           animal.sound();
       }
    }

    Здесь метод soundдинамически отправляется во время выполнения в зависимости от фактического типа объекта. Вектор animalsсодержит объекты признаков (Box), представляющие различные типы животных.