这个周末开始学习生锈,我正试图在我的课堂上编写一个小的私有助手方法来查找一些内部值,但事实证明它非常复杂。我有几个结构实现了一个特性:
trait Animal {}
struct Dog {}
impl Dog for Animal{}
struct Cat{}
impl Cat for Animal{}连同一个装有多种动物变体的容器:
struct Person {
my_dog: Dog,
my_cat: Cat
}我想要做的是编写一个助手来查找适当的动物,如下所示:
impl Person {
fn look_up_animal(&self, animal_name: &str) -> Box<&dyn Animal> {
match animal_name {
"dog" => Box::from(&self.my_dog),
"cat" => Box::from(&self.my_cat)
}
}
}不幸的是,我不太清楚如何处理这些类型。上面使用引用和 Box的版本提供了一个错误,比如“预期的struct Box<&dyn Animal>但得到了struct Box<&Dog>,所以我不太确定如何将常规值转换为dyn值。
发布于 2020-04-18 23:34:34
您想要的完全明确的版本将是
impl Person {
fn look_up_animal(&self, animal_name: &str) -> Option<Box<&dyn Animal>> {
match animal_name {
"dog" => Some(Box::from(&self.my_dog as &dyn Animal)),
"cat" => Some(Box::from(&self.my_cat as &dyn Animal)),
_ => None,
}
}
}铁锈可以强制一层引用特性对象,但两层引用( Box和&)会将其绊倒。(在Box中具有引用也会触发clippy警告。)这意味着另一种解决方案。
impl Person {
fn look_up_animal(&self, animal_name: &str) -> Option<&dyn Animal> {
match animal_name {
"dog" => Some(&self.my_dog as &dyn Animal),
"cat" => Some(&self.my_cat as &dyn Animal),
_ => None,
}
}
}这一次,显式强制转换as &dyn Animal是不必要的,因为只有一层引用。
impl Person {
fn look_up_animal(&self, animal_name: &str) -> Option<&dyn Animal> {
match animal_name {
"dog" => Some(&self.my_dog),
"cat" => Some(&self.my_cat),
_ => None,
}
}
}注意:我在Option中添加了一些内容,以便在animal_name不是"dog"或"cat"时返回一些内容。您也可能会对实现Animal的其他东西感到恐慌或默认。
https://stackoverflow.com/questions/61297300
复制相似问题