Rust Petgraph WASM Project, пытающийся использовать struct со свойством Graph, но требует 2 параметра - PullRequest
2 голосов
/ 29 апреля 2020

Я очень плохо знаком с Rust, так что это может быть очень грубый ie вопрос.

Я пытаюсь создать веб-приложение с rust -> wasm. Пытался следовать учебнику https://rustwasm.github.io/docs/book/introduction.html и пытался использовать пакет ящиков "petgraph". Я нашел следующее

use petgraph::graph::Graph;
#[wasm_bindgen]
pub struct TreeStructure {
    directed_graph: Graph
}
#[wasm_bindgen]
impl TreeStructure {
    pub fn new() -> TreeStructure {
        TreeStructure {
            directed_graph: Graph::<&str, &str>::new()
        }
    }
     pub fn addNode(&mut self, newNode: &str) {
        let findIndex = self.findNode(newNode);
        if findIndex < 0 {
            self.directed_graph.add_node(newNode);
        } else {
            alert("cant add, this {} already exist in the nodes", newNode);
        }
    }

    pub fn removeNode(&mut self, toRemoveNode: &str) {
        let findIndex = self.findNode(toRemoveNode);
        if findIndex > -1 {
            self.directed_graph.remove_node(toRemoveNode);
        } else {
            alert("cant remove, cannot find {} in the nodes", toRemoveNode);
        }
    }

    pub fn addEdge(&mut self, fromNode: &str, toNode: &str) {
        let fromIndex = self.findNode(fromNode);
        let toIndex = self.findNode(toNode);
        if fromIndex > -1 && toIndex > -1 {
            let alreadyEdged = self.directed_graph.contains_edge(fromIndex, toIndex);
            if !alreadyEdged {
                self.directed_graph.add_edge(fromIndex, toIndex, "");
            } else {
                alert("edge already exist from {} to {}", fromNode, toNode);
            }
        }
    }

    pub fn getNeighbors(&self, checkNode: &str) -> Array {
        let checkIndex = self.findNode(checkNode);
        if checkIndex < 0 {
            return vec![].into_inter().collect();
        }
        self.directed_graph.neighbors_directed(checkIndex).collect();
    }
}
impl TreeStructure {
    pub fn findNode(&self, nodeToFind: &str) -> i32 {
        let findIndex = self.directed_graph.node_indices().collect::<Vec<_>>().iter().position(|&r| r == nodeToFind);
        match findIndex {
            Some(x) => x,
            None => -1
        }
    }
}

, но это дает мне ошибку компиляции

error[E0107]: wrong number of type arguments: expected at least 2, found 0
--> src/lib.rs:25:25
   |
25 |         directed_graph: Graph
   |                         ^^^^^ expected at least 2 type arguments

Чтение https://docs.rs/petgraph/0.5.0/petgraph/graph/struct.Graph.html Затем я попытался

use petgraph::graph::Node;
use petgraph::graph::Edge;
pub struct TreeStructure<N: Node, E: Edge> {
    directed_graph: Graph<N, E>
}

Но тогда говорится, что wasm-bindgen не поддерживает этот синтаксис? Что мне здесь делать?

1 Ответ

2 голосов
/ 29 апреля 2020

Учитывая, что ваша new функция помещает Graph::<&str, &str> в directed_graph, это то, что вы также должны использовать в объявлении:

pub struct TreeStructure {
    directed_graph: Graph<&str, &str>,
}

Однако для этого необходимо указать время жизни. Я не достаточно знаком с wasm, чтобы сказать, какой из них будет лучшим (плюс это зависит от того, что именно вы положили в график), но вам, вероятно, придется либо использовать 'static время жизни:

pub struct TreeStructure {
    directed_graph: Graph<&'static str, & 'static str>,
}

который также потребует, чтобы вы указали время жизни 'static для параметров вашего метода. Или вам нужно будет перейти к собственным строкам:

pub struct TreeStructure {
    directed_graph: Graph<String, String>,
}

снова с соответствующими изменениями в ваших методах.

...