Rust 无法使用强制unsized将嵌套大小的类型强制为非大小的类型

Rust 无法使用强制unsized将嵌套大小的类型强制为非大小的类型,rust,coerce,Rust,Coerce,我正在尝试使用“强制”的功能: use std::rc::Rc; use std::borrow::Borrow; fn main() { // Create (sized) i32 wrapped in an rc. let a0: Rc<i32> = Rc::new(0i32); // Coerce to (unsized) Borrow<i32> wrapped in an rc. // Works fine in Beta and

我正在尝试使用“强制”的功能:

use std::rc::Rc;
use std::borrow::Borrow;

fn main() {
    // Create (sized) i32 wrapped in an rc.
    let a0: Rc<i32> = Rc::new(0i32);
    // Coerce to (unsized) Borrow<i32> wrapped in an rc.
    // Works fine in Beta and Nightly cause of CoerceUnsized.
    let a1: Rc<Borrow<i32>> = a0.clone();

    // Create (sized) i32 in nested rcs.
    let b0: Rc<Rc<i32>> = Rc::new(Rc::new(0i32));
    // Coerce to (unsized) Borrow<i32> in nested rcs.
    // Does not compile in Stable, Beta or Nightly.
    let b1: Rc<Rc<Borrow<i32>>> = b0.clone();

    println!("{}, {}", a1.borrow(), b1.borrow());
}
使用std::rc::rc;
使用std::借用::借用;
fn main(){
//创建(大小)包装在rc中的i32。
设a0:Rc=Rc::new(0i32);
//强制(未调整大小)借用包装在rc中的文件。
//在测试版和夜间因胁迫而正常工作。
设a1:Rc=a0.clone();
//在嵌套rcs中创建(调整大小)i32。
设b0:Rc=Rc::new(Rc::new(0i32));
//强制在嵌套rcs中借用(未调整大小)。
//不以稳定、测试版或夜间版本编译。
设b1:Rc=b0.clone();
println!(“{},{}”,a1.borrow(),b1.borrow());
}

但是从
Rc
Rc
的嵌套强制不会编译


为什么强制化的
不能递归地工作?是否有任何解决方法,例如显式强制转换?

Rc
转换为
Rc
只需在
Rc
旁边添加一个vtable指针,它不会影响
Rc
管理的内存。另一方面,将
Rc
转换为
Rc将
Rc
转换为
Rc
只需要在
Rc
旁边添加一个vtable指针,它不会影响
Rc
管理的内存。另一方面,将
Rc
转换为
RcIs本质上与您不能将
Vec
强制转换为
&[&[t]
的原因相同-中间项需要更改大小?好的,您是对的,类型
Rc
需要一个vtable指针。但关键是,将
Rc
强制到
Rc
不会导致vtable指针位于i32旁边的堆上。如果将
&i32
转换为
&Borrow
,则vtable指针将保持在每个引用旁边。所以我猜测,vtable指针总是保持在最外层嵌套层的旁边。这将允许这种类型的转换。我真的错了吗?@Pentagolo不,vtable指针位于最内层嵌套级别的旁边(例如,最内层的适用级别&mdash;
RefCell
只是另一个未调整大小的类型,而不是可以存储vtable指针的引用。)哦,好的。那么一般来说,第一个适用的嵌套级别是什么?即使内部类型未调整大小,第一个内部级别是否仍保持相同的大小?如何在Rust中实现包含潜在未大小化类型的结构?如果3个嵌套结构可能没有大小,那么vtable指针位于何处?对于我来说,如果默认情况下vtable指针位于最外层嵌套级别的旁边,那么Rust看起来会更加灵活和向前倾斜。std库提供的特殊包装类型可以强制vtable位于特殊包装类型的旁边。自动实现的标记特征可以指示类型是否需要外部嵌套级别的vtable。这是否会破坏该语言的任何其他现有功能或任何现有代码?这与您不能强制
Vec
&[&[t]]
的原因基本相同-中间项需要更改大小?好的,您是对的,类型
Rc
需要一个vtable指针。但关键是,将
Rc
强制到
Rc
不会导致vtable指针位于i32旁边的堆上。如果将
&i32
转换为
&Borrow
,则vtable指针将保持在每个引用旁边。所以我猜测,vtable指针总是保持在最外层嵌套层的旁边。这将允许这种类型的转换。我真的错了吗?@Pentagolo不,vtable指针位于最内层嵌套级别的旁边(例如,最内层的适用级别&mdash;
RefCell
只是另一个未调整大小的类型,而不是可以存储vtable指针的引用。)哦,好的。那么一般来说,第一个适用的嵌套级别是什么?即使内部类型未调整大小,第一个内部级别是否仍保持相同的大小?如何在Rust中实现包含潜在未大小化类型的结构?如果3个嵌套结构可能没有大小,那么vtable指针位于何处?对于我来说,如果默认情况下vtable指针位于最外层嵌套级别的旁边,那么Rust看起来会更加灵活和向前倾斜。std库提供的特殊包装类型可以强制vtable位于特殊包装类型的旁边。自动实现的标记特征可以指示类型是否需要外部嵌套级别的vtable。这会破坏该语言或任何现有代码的任何其他现有功能吗?