首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回对Box<dyn Trait>的引用

返回对Box<dyn Trait>的引用
EN

Stack Overflow用户
提问于 2020-04-18 22:47:39
回答 1查看 2K关注 0票数 3

这个周末开始学习生锈,我正试图在我的课堂上编写一个小的私有助手方法来查找一些内部值,但事实证明它非常复杂。我有几个结构实现了一个特性:

代码语言:javascript
复制
trait Animal {}

struct Dog {}
impl Dog for Animal{}

struct Cat{}
impl Cat for Animal{}

连同一个装有多种动物变体的容器:

代码语言:javascript
复制
struct Person {
  my_dog: Dog,
  my_cat: Cat
}

我想要做的是编写一个助手来查找适当的动物,如下所示:

代码语言:javascript
复制
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值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-18 23:34:34

您想要的完全明确的版本将是

代码语言:javascript
复制
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警告。)这意味着另一种解决方案。

代码语言:javascript
复制
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是不必要的,因为只有一层引用。

代码语言:javascript
复制
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的其他东西感到恐慌或默认。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61297300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档