我有一个带有要添加到队列的父属性的结构。父项与自身的类型相同,因此我需要将其包装在Box
中。
use std::collections::vec_deque::VecDeque;
struct GraphNode {
value: u32,
parent: Option<Box<&GraphNode>>,
}
fn main() {
let mut queue: VecDeque<GraphNode> = VecDeque::new();
let parent = GraphNode {
value: 23,
parent: Option::None,
};
let second = GraphNode { value: 42, parent };
let third = GraphNode {
value: 19,
parent: Option::Some(Box::from(&parent)),
};
queue.push_front(parent);
queue.push_front(second);
queue.push_front(third);
}
error[E0106]: missing lifetime specifier
--> src/main.rs:5:24
|
5 | parent: Option<Box<&GraphNode>>,
| ^ expected lifetime paramete
parent可以为null,因此我认为它必须为Box<Option<&GraphNode>>
,但出现错误expected lifetime parameter
,但是文档中的内容对我来说并没有什么意义。>
还有一个问题,当我创建一个Box
并保存到父级时,值会移动。我不想移动值,我只想在框中保存引用。
答案 0 :(得分:2)
我认为您正在寻找的是Exception in thread "main" java.lang.UnsatisfiedLinkError: no jniFastTextWrapper in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:945)
at org.bytedeco.javacpp.Loader.load(Loader.java:750)
at org.bytedeco.javacpp.Loader.load(Loader.java:657)
at com.github.jfasttext.FastTextWrapper.<clinit>(FastTextWrapper.java:10)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.bytedeco.javacpp.Loader.load(Loader.java:712)
at org.bytedeco.javacpp.Loader.load(Loader.java:657)
at com.github.jfasttext.FastTextWrapper$FastTextApi.<clinit>(FastTextWrapper.java:171)
at com.github.jfasttext.JFastText.<init>(JFastText.java:14)
at com.jfasttext.zohar.jfasttext.example.App.main(App.java:7)
,而不是std::rc::Rc
。
Box
use std::collections::vec_deque::VecDeque;
use std::rc::Rc;
struct GraphNode {
value: u32,
parent: Option<Rc<GraphNode>>,
}
fn main() {
let mut queue: VecDeque<Rc<GraphNode>> = VecDeque::new();
let parent = Rc::new(GraphNode {
value: 23,
parent: None,
});
let second = Rc::new(GraphNode {
value: 42,
parent: None,
});
let third = Rc::new(GraphNode {
value: 19,
parent: Some(parent.clone()), // Clones the reference, still point to the same thing.
});
queue.push_front(parent);
queue.push_front(second);
queue.push_front(third);
}
( r 引用 c 座标)是一种使多个“所有者”属于同一对象的方法。克隆时,您只是在克隆参考,因此对其中一个所做的更改将影响另一个。
您遇到的生命周期问题是因为您正在存储用Rc
进行的直接引用(实际上不知道应该调用什么)。
如果您想进一步了解生命周期,请访问the entry from the book。