我正在尝试在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)
这会产生错误:
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'".
我做错了什么还是错误?怎么做得好?
我正在尝试编写通用的递归数据结构.事实证明,当我想要访问一个拥有的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)