gpt4 book ai didi

rust - 从 Box 返回 dyn Trait

转载 作者:行者123 更新时间:2023-12-03 11:30:14 29 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Why doesn't Rust support trait object upcasting?

(4 个回答)


2年前关闭。




如果我有 Box<dyn Trait1 + Trait2> , 我可以返回 &dyn Trait1 ?

为了提供一些背景信息,我正在尝试在 rust 中实现一个(专门的)图。这个SpecialisedGraph需要一些标准的图算法,我想使用 Graph 来实现这些可以在多个图形类型之间共享但此代码未编译的特征:

trait Node {
//...
}

trait Graph {
fn get_node(&self, key: &str) -> Option<&dyn Node>;
}

trait SpecialisedNode {
//...
}

trait SpecialisedGraphNode: SpecialisedNode + Node {}

struct SpecialisedGraph {
nodes: HashMap<String, Box<dyn SpecialisedGraphNode>>
}

impl Graph for SpecialisedGraph {
fn get_node(&self, key: &str) -> Option<&dyn Node> {
match self.nodes.get(key) {
Some(node) => Some(&(**node)),
None => None
}
}
}

有错误:
error[E0308]: mismatched types
--> src\main.rs:25:32
|
25 | Some(node) => Some(&(**node)),
| ^^^^^^^^^ expected trait `Node`, found trait `SpecialisedGraphNode`
|
= note: expected reference `&dyn Node`
found reference `&dyn SpecialisedGraphNode`

编辑:我已经编辑了问题以反射(reflect)评论

EDIT2:使用链接 Why doesn't Rust support trait object upcasting? 找到了我的问题的答案由 Shepmaster 提供。

下面的更新代码现在可以工作了,谢谢大家。
trait AsNode {
fn as_node(&self) -> &dyn Node;
}

trait Node : AsNode {
//...
}

impl<T: Node> AsNode for T {
fn as_node(&self) -> &dyn Node {
self
}
}

trait Graph {
fn get_node(&self, key: &str) -> Option<&dyn Node>;
}

trait SpecialisedNode : Node {
//...
}

struct SpecialisedGraph {
nodes: HashMap<String, Box<dyn SpecialisedNode>>
}

impl Graph for SpecialisedGraph {
fn get_node(&self, key: &str) -> Option<&dyn Node> {
match self.nodes.get(key) {
Some(node) => Some(node.as_node()),
None => None
}
}
}

最佳答案

你不能。一个 HashMap<String, Box<dyn SpecialisedGraphNode>不是 HashMap<String, Box<dyn Node> ,因此您无法形成对该类型的引用。如果您使用不安全的代码执行此操作,则会调用未定义的行为,因为这些框没有相同的数据。

我也认为你的感觉是错误的——至少 Java、C++ 和 C#(以最常见的静态类型 OO 语言命名)也不允许你这样做。 (C# 允许您使用 IReadOnlyDictionary 和接口(interface)的协变泛型参数做类似的事情。但不适用于具体类型。)

您可能需要重新考虑您的 Graph特征。它真的必须以哈希映射的形式访问节点吗?也许它可以简单地提供一个函数来查找一个节点,并将其作为 &dyn Node 返回?

关于rust - 从 Box<dyn Trait 1 + Trait 2> 返回 dyn Trait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60157976/

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