0

我有以下代码:

struct Node {
    id: uint
}

struct Graph {
    nodes: Vec<Node>
}

impl Graph {

    fn new() -> Graph {
        return Graph { nodes: Vec::new() };
    }

    fn create_node(&mut self) -> &Node {
        let index = self.nodes.len();
        let node = Node { id: index };
        self.nodes.push(node);
        // return &node;           // error: `node` does not live long enough
        return &self.nodes[index]; // ...but this work fine
    }

}

这个想法是图创建一个新节点并将其“借给”给调用该方法的人。但我不知道如何返回对新创建结构的引用。第二次返回工作正常,但显然无效。

如何在不从向量中取回节点的情况下返回节点?

4

2 回答 2

2

这就是您无法返回的原因&node

fn create_node(&mut self) -> &Node {
    let index = self.nodes.len();
    let node = Node { id: index };
    println!("{}", &node as *const Node);
    self.nodes.push(node);
    println!("{}", &self.nodes[index] as *const Node);
    return &self.nodes[index];
}

这是一个示例输出:

0x7fffc36a3418
0x7f4c96c2d000

如您所见,&node&self.nodes[index]返回完全不同的值。而且,&node(0x7fffc36a3418)一返回就失效了create_node,因为这个地址指向create_node调用帧,函数返回时释放一个调用帧。

于 2015-01-09T04:28:23.413 回答
2

但我不知道如何返回对新创建结构的引用。

你不能。这是所有制制度所排除的基本错误之一。

假设你可以。然后当你的函数返回时,这样的引用将指向被破坏的内存。

您可以在所有权官方指南中阅读有关所有权的更多信息。它解释了所有权和借款的工作原理,包括您的程序不正确的原因。

顺便说一句,除非你有#[derive(Copy)]你的,否则Node引用node也不会工作,因为node它被移动到了向量中。所有权指南也解释了移动语义。

于 2015-01-08T14:04:17.823 回答