[英]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.