gpt4 book ai didi

rust - 无法使用 CoerceUnsized 将嵌套大小的类型强制为未设置大小的类型

转载 作者:行者123 更新时间:2023-11-29 08:12:35 24 4
gpt4 key购买 nike

我正在尝试使用 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());
}

Playground

但是来自 Rc<Rc<i32>> 的嵌套强制至 Rc<Rc<Borrow<i32>>>不编译。

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

最佳答案

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

关于rust - 无法使用 CoerceUnsized 将嵌套大小的类型强制为未设置大小的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39065931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com