我经常想在 Rust 中定义递归数据类型。我们需要某种程度的间接性来避免具有无限大小的类型。经典的解决方案是使用Box
(游乐场):
enum IntList {
Empty,
Cons(i32, Box<IntList>),
}
我遇到的问题是它要求列表拥有自己的尾巴。这意味着您不能在共享尾部的两个列表之间共享空间,因为两者都想拥有它。您可以使用借来的参考(playground):
enum IntList<'a> {
Empty,
Cons(i32, &'a IntList<'a>),
}
但是很难创建一个列表,因为它不允许拥有自己的尾巴。
有没有办法让列表不在乎它是否拥有尾巴?这样我就可以让一个列表拥有尾部,而另一个列表引用同一个列表作为它的尾部。
我的尝试
我的第一个想法是Cow
用于此目的,但我无法让它发挥作用。这就是我尝试过的(游乐场):
#[derive(Clone)]
enum IntList<'a> {
Empty,
Cons(i32, Cow<'a, IntList<'a>),
}
但它失败并出现错误
error[E0275]: overflow evaluating the requirement `IntList<'a>: std::marker::Sized`
--> src/main.rs:8:13
|
8 | Cons(i32, Cow<'a, IntList<'a>>),
| ^^^^^^^^^^^^^^^^^^^^
|
= note: required because of the requirements on the impl of `std::borrow::ToOwned` for `IntList<'a>`
= note: required because it appears within the type `std::borrow::Cow<'a, IntList<'a>>`
= note: no field of an enum variant may have a dynamically sized type