小编ebv*_*aim的帖子

为什么我得到"参数永远不会被使用[E0392]"?

我正在尝试在Rust中实现一个Octree.八叉树在具有约束的类型上是通用的,它应该实现一般特征:

pub trait Generable<U> {
    fn generate_children(&self, data: &U) -> Vec<Option<Self>>;
}

pub enum Octree<T, U>
where
    T: Generable<U>,
{
    Node {
        data: T,
        children: Vec<Box<Octree<T, U>>>,
    },
    Empty,
    Uninitialized,
}
Run Code Online (Sandbox Code Playgroud)

这是在Playground上重现问题简化示例

这会产生错误:

error[E0392]: parameter `U` is never used
 --> src/main.rs:5:20
  |
5 | pub enum Octree<T, U>
  |                    ^ unused type parameter
  |
  = help: consider removing `U` or using a marker such as `std::marker::PhantomData`
Run Code Online (Sandbox Code Playgroud)

U从签名中删除会导致"未声明的类型名称'U'".

我做错了什么还是错误?怎么做得好?

rust

8
推荐指数
1
解决办法
768
查看次数

如何绑定盒装结构的多个字段而不会出现"使用移动值"错误?

我正在尝试编写通用的递归数据结构.事实证明,当我想要访问一个拥有的struct值的多个字段时,我无法进入墙.

我定义了一个包含列表的结构:

struct ListNode<T> {
    val: T,
    tail: List<T>
}

struct List<T>(Option<Box<ListNode<T>>>);
Run Code Online (Sandbox Code Playgroud)

空列表由List(None).表示.

我希望能够附加到列表中:

impl<T> List<T> {
    fn append(self, val: T) -> List<T> {
        match self {
            List(None) => List(Some(Box::new(ListNode {
                val: val,
                tail: List(None),
            }))),
            List(Some(node)) => List(Some(Box::new(ListNode {
                val: node.val,
                tail: node.tail.append(val),
            }))),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这失败了一个可以理解的错误:

error[E0382]: use of moved value: `node`
  --> src/main.rs:17:23
   |
16 |                 val: node.val,
   |                      -------- value moved here
17 |                 tail: node.tail.append(val),
   |                       ^^^^^^^^^ value used here after move …
Run Code Online (Sandbox Code Playgroud)

struct ownership rust

7
推荐指数
1
解决办法
424
查看次数

标签 统计

rust ×2

ownership ×1

struct ×1