Rust из реализации для Vec<T>

Учитывая код


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. Сообщение об ошибке выше не дает мне никаких подробностей. Разве нельзя реализовать from для Vec Type за пределами крейта Vec?

Если у вас есть impl From<Node> for NodeFragment {}, вы можете создать преобразование Vec<Node> -> Vec<NodeFragment>, поместив .into_iter().map(NodeFragment::from).collect::<Vec<_>>() на свой век узлов.

myrrlyn 21.05.2024 00:11
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
1
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сообщение об ошибке довольно явно: при реализации From для типа U требуемая подпись метода fromfn (T) -> U.

В вашем случае T = Vec<Node> и U = NodeFragment, поэтому требуемый метод — fn from(value: Vec<Node>) -> NodeFragment.

То, что вы пытаетесь сделать, потребует T = Vec<Node> и U = Vec<NodeFragment>, но вы не можете реализовать внешний признак (std::convert::From) в иностранном типе (std::vec::Vec).

Вы не можете использовать признак From для реализации своего метода преобразования, и для этого вам следует полагаться на собственный метод/типаж.

Другие вопросы по теме