Текст «armanriazi•rust•static•vs•cons» представляет собой комбинацию ключевых слов, относящихся к языку программирования Rust и теме статического и динамического поведения. Поскольку неясно, какие именно методы или примеры вы ищете, я предоставлю общий обзор статического и динамического поведения в Rust и несколько примеров кода для иллюстрации концепций.
В Rust статическое и динамическое поведение относятся к различным способам обработки переменных и данных. Статическое поведение связано с решениями и оптимизацией во время компиляции, тогда как динамическое поведение предполагает решения и гибкость во время выполнения. Вот несколько методов и примеров кода, подчеркивающих различия:
-
Статические переменные:
static HELLO_WORLD: &str = "Hello, world!"; fn main() { println!("{}", HELLO_WORLD); }В этом примере переменная
HELLO_WORLDобъявлена статической, то есть ее значение известно во время компиляции и не может быть изменено. -
Динамические переменные:
fn main() { let hello_world = String::from("Hello, world!"); println!("{}", hello_world); }Здесь переменная
hello_worldобъявлена как динамическая строка с использованием типаString. Его значение можно изменить во время выполнения. -
Статическая отправка (полиморфизм времени компиляции):
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. Вызываемый метод определяется во время компиляции на основе фактического типа переданного объекта. -
Динамическая отправка (полиморфизм времени выполнения):
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), представляющие различные типы животных.