Avatar ·

Rust中的trait object是什么以及如何创建?

大家好!我最近在学习Rust,正在尝试理解trait。我读过文档,但"trait object"这个概念对我来说还是很模糊。 这是我写的一个简单的trait: ```rust trait Animal { fn speak(&self); } struct Dog; impl Animal for Dog { fn speak(&self) { println!("Woof!"); } } struct Cat; impl Animal for Cat { fn speak(&self) { println!("Meow!"); } } ``` 我想创建一个向量来存储不同的动物——比如Dog和Cat。但如果我写`Vec`,编译器会报错,说Animal是一个trait而不是类型。网上建议用`Box`,但我不明白这个`dyn`是什么,为什么不用它就不行。 请用简单易懂的方式解释一下: 1. 什么是trait object? 2. 它在底层是如何工作的? 3. 为什么需要写`dyn`,它是什么意思? 4. trait object有哪些限制? 谢谢! <<>>

什么是trait object?

Trait object(trait对象)——是一种动态分发的方式,让你可以把实现了某个trait的不同类型的值当作统一类型来使用。在你的例子中,`Box`就是一个trait object,它可以同时存储Dog和Cat。