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

ebv*_*aim 8 rust

我正在尝试在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'".

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

She*_*ter 7

我不相信你想要另一个通用,你想要一个相关的类型:

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

pub enum Octree<T>
where
    T: Generable,
{
    Node {
        data: T,
        children: Vec<Box<Octree<T>>>,
    },
    Empty,
    Uninitialized,
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,Vec<Box<Octree<T>>>可能只有一个额外的间接 - 你可以使用Vec<Octree<T>>.