Rust 为什么可以';我们是否使用RefCell进行递归数据结构?

Rust 为什么可以';我们是否使用RefCell进行递归数据结构?,rust,Rust,为什么我们不能在Rust中使用RefCell进行递归数据结构 无效: enum List { Cons(i32, RefCell<List>), Nil, } 枚举列表{ Cons(i32,参考电池), 无 } 有效期: enum List { Cons(i32, Rc<List>), // or Box<List> Nil, } 枚举列表{ Cons(i32,Rc),//或Box 无 } RefCell包含对象,并将其包

为什么我们不能在Rust中使用
RefCell
进行递归数据结构

无效:

enum List {
    Cons(i32, RefCell<List>),
    Nil,
}
枚举列表{
Cons(i32,参考电池),
无
}
有效期:

enum List {
    Cons(i32, Rc<List>), // or Box<List>
    Nil,
}
枚举列表{
Cons(i32,Rc),//或Box
无
}

RefCell
包含对象,并将其包装,它不是堆分配的值。这就是为什么编译器说“递归而无间接”:
RefCell
不是间接寻址

另一方面,
Box
Rc
包含对分配到其他地方的对象的引用,因此是间接的

如果没有间接寻址,
列表
枚举最终是无限的,因为每个
Cons
在其
RefCell
中都包含一个完整的
列表
枚举


您不能执行将自身作为值、仅作为指针或引用的递归数据结构。

这是否足够类似,以至于可以将其作为副本关闭?这个问题不同。我理解为什么递归类型是无效的,我们可以使用间接寻址来解决这个问题。但我假设所有智能指针都提供间接寻址,因为它们毕竟是指针。所以我的问题是为什么RefCell不提供间接寻址?