簡體   English   中英

返回對 Box 的引用<dyn trait></dyn>

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM