我有以下代码:
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
}
}
这个想法是该图创建一个新节点并将其“借给”调用该方法的人。但我不知道如何返回对新创建结构的引用。第二次返回工作正常,但显然无效。
如何在不从向量中取回节点的情况下返回节点?
最佳答案
这就是你不能返回 &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
调用帧,一个调用帧是当函数返回时释放。
关于rust - 如何返回指向拥有值 "does not live long enough"的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27841657/