Rust 返回及;dyn Trait1从盒子中取出<;dyn Trait1+;Trait2>;

Rust 返回及;dyn Trait1从盒子中取出<;dyn Trait1+;Trait2>;,rust,Rust,如果我有一个框,我可以返回&dyn Trait1 为了提供一些上下文,我正在尝试在rust中实现一个(专门的)图。这个SpecializedGraph需要一些标准的图形算法,我想使用graph特性来实现这些算法,该特性可以在多个图形类型中共享,但此代码未编译: trait Node { //... } trait Graph { fn get_node(&self, key: &str) -> Option<&dyn Node>; }

如果我有一个
,我可以返回
&dyn Trait1

为了提供一些上下文,我正在尝试在rust中实现一个(专门的)图。这个
SpecializedGraph
需要一些标准的图形算法,我想使用
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
        }
    }
}
编辑:我对问题进行了编辑,以反映评论

EDIT2:使用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
        }
    }
}
trait作为节点{
fn as_节点(&self)->&dyn节点;
}
特征节点:AsNode{
//...
}
IMPLASNODE for T{
fn as_节点(&self)->&dyn节点{
自己
}
}
特征图{
fn get_节点(&self,key:&str)->选项;
}
特征专用节点:节点{
//...
}
结构边缘图{
节点:HashMap
}
专用边图的impl图{
fn get_节点(&self,key:&str)->选项{
匹配self.nodes.get(键){
Some(node)=>Some(node.as_node()),
无=>无
}
}
}

你不能。A
HashMapIt看起来您的问题可能由的答案回答。如果没有,请回答您的问题以解释差异。否则,我们可以将此问题标记为已回答。另请参见-returning
&Box
不是惯用语。谢谢,我不知道
&Box
不是惯用语!不过,我的特征是相互关联的,当我有一个
SpecializedGraphNode
时,我知道它实现了
Node
谢谢@Sebastian Redl,这很有帮助。我遇到了另一个问题,所以我只是编辑了我的问题以反映您的评论
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
        }
    }
}