1

我正在尝试使用以下功能CoerceUnsized

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());
}

操场

但是嵌套的强制 from Rc<Rc<i32>>toRc<Rc<Borrow<i32>>>不会编译。

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

4

1 回答 1

4

将 a 转换为Rc<i32>Rc<Borrow<i32>>需要在 旁边添加一个 vtable 指针Rc,并且不会影响 . 管理的内存Rc。另一方面,转换Rc<Rc<i32>>Rc<Rc<Borrow<i32>>将意味着将 vtable 指针隐藏在 inner 旁边Rc。这将需要修改(和扩大)由外部管理的内存Rc(即,它实际上需要一个全新的分配)。您可以手动执行此操作,但这远远超出了强制的范围。

于 2016-08-21T15:51:41.397 回答