代码之家  ›  专栏  ›  技术社区  ›  RiseYx Saramoso

Vec<T>的Rust From实现

  •  0
  • RiseYx Saramoso  · 技术社区  · 2 年前

    给定代码

    
    struct NodeFragment{
        char: String,
        name: String,
        cost: i32,
        r#type: String
    }
    
    pub struct Node {
        pub char_name: String,
        pub node_name: String,
        pub cp_cost: i32,
        pub node_type: NodeType,
    }
    
    impl From<Node> for NodeFragment{
        fn from(value: Node) -> Self {
            NodeFragment{ char: value.char_name, name: value.node_name, cost: value.cp_cost, r#type: value.node_type.to_string() }
        }
    }
    
    impl From<Vec<Node>> for NodeFragment{
        fn from(value: Vec<Node>) -> Vec<NodeFragment> {
            //foreach mapping value to Vec<NodeFragment>
            vec![]
        }
    }
    

    我得到了那个错误:

    method `from` has an incompatible type for trait
    expected signature `fn(Vec<_>) -> NodeFragment`
       found signature `fn(Vec<_>) -> Vec<NodeFragment>`rustcClick for full compiler diagnostic
    main.rs(34, 34): change the output type to match the trait: `NodeFragment`
    

    如何实现的方法 Vec<Node> 以获得 Vec<NodeFragment> ?

    我认为from Trait的概念是,我将类型A转换为类型B。上面的错误消息没有给我任何细节。是否不允许在Vec板条箱外对Vec类型执行?

    1 回复  |  直到 2 年前
        1
  •  4
  •   sleider    2 年前

    当为类型U实现From时,错误消息非常明确,这是所需的方法 from 的签名是 fn (T) -> U .

    在您的情况下, T = Vec<Node> U = NodeFragment ,因此所需的方法是 fn from(value: Vec<Node>) -> NodeFragment .

    你试图做的事情需要 T=Vec<节点> U = Vec<NodeFragment> ,但你不能实现外来特性( std::convert::From )关于外国类型( std::vec::Vec ).

    您不能使用 From trait来实现您的转换方法,并且应该依靠自定义方法/trait来实现。

    推荐文章