可选递归类型

时间:2019-02-24 02:46:32

标签: rust

我有一个带有要添加到队列的父属性的结构。父项与自身的类型相同,因此我需要将其包装在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);
}

Playground

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并保存到父级时,值会移动。我不想移动值,我只想在框中保存引用。

1 个答案:

答案 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

Playground

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

相关问题