![](/img/trans.png)
[英]How do you convert a Box<dyn Trait> to a Rc<dyn Trait>?
[英]Returning a reference to a Box<dyn Trait>
这个周末开始学习 rust,我试图在我的 class 上写一个小的私有辅助方法来查找一些内部值,但事实证明它相当复杂。 我有一些实现特征的结构:
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
的版本给出了类似“expected struct Box<&dyn Animal>
but got struct Box<&Dog>
的错误,所以我不太确定如何将常规值转换为dyn
值。
你想要的完全明确的版本是
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,
}
}
}
Rust 能够强制对特征对象的一层引用,但是两层引用( 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
的东西。
这个周末开始学习 rust,我正在尝试在我的 class 上编写一个小的私有帮助方法来查找一些内部值,但事实证明它相当复杂。 我有一些实现特征的结构:
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
的版本给出了一个错误,如 "expected struct Box<&dyn Animal>
but got struct Box<&Dog>
,所以我不确定如何将常规值转换为dyn
值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.