gpt4 book ai didi

rust - 返回对 Box 的引用

转载 作者:行者123 更新时间:2023-12-03 11:43:17 25 4
gpt4 key购买 nike

这个周末开始学习 rust,我正在尝试在我的类里面编写一个小的私有(private)帮助方法来查找一些内部值,但事实证明它非常复杂。我有一些实现特征的结构:

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 能够强制对 trait 对象进行一层引用,但是两层引用( 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,
}
}
}

(playground link)

注意:我在 Option 中添加了以便在 animal_name 时返回一些东西不是 "dog""cat" .你也可能会 panic 或默认使用其他实现 Animal 的东西。 .

关于rust - 返回对 Box<dyn Trait> 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61297300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com