【Rust】trait-動態返回
阿新 • • 發佈:2021-12-23
環境
- Rust 1.56.1
- VSCode 1.61.2
概念
參考:https://doc.rust-lang.org/rust-by-example/trait/dyn.html
示例
由於 rust 在編譯時需要知道佔用多少棧空間,所以不能直接返回一個 trait,因為不同的 trait 實現可能佔用不同的空間。解決方式是將物件分配到堆上,然後只返回一個引用,引用所佔空間是明確的,在堆上分配需要使用 Box。
main.rs
struct Sheep {} struct Cow {} trait Animal { fn noise(&self) -> &str; } impl Animal for Sheep { fn noise(&self) -> &'static str { "baaaaah!" } } impl Animal for Cow { fn noise(&self) -> &'static str { "moooooo!" } } fn random_animal(random_number: f64) -> Box<dyn Animal> { if random_number < 0.5 { Box::new(Sheep {}) } else { Box::new(Cow {}) } } fn main() { let random_number = 0.234; let animal = random_animal(random_number); println!( "You've randomly chosen an animal, and it says {}", animal.noise() ); }
總結
瞭解了 Rust 中動態返回,這個是實現多型性的必須功能。