无法使用 CoerceUnsized 将嵌套大小的类型强制为未设置大小的类型
Unable to coerce nested sized to unsized type using CoerceUnsized
我正在尝试使用 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());
}
但是从 Rc<Rc<i32>>
到 Rc<Rc<Borrow<i32>>>
的嵌套强制不编译。
为什么CoerceUnsized
不能递归工作?是否有任何解决方法,例如显式转换?
将 Rc<i32>
转换为 Rc<Borrow<i32>>
只需要在 Rc
旁边添加一个 vtable 指针,它不会影响 [=12= 管理的内存].另一方面,将 Rc<Rc<i32>>
转换为 Rc<Rc<Borrow<i32>>
意味着将 vtable 指针 存储在内部 Rc
旁边。这将需要修改(并扩大)由外部 Rc
管理的内存(即,它实际上需要一个全新的分配)。您可以手动执行此操作,但这远远超出了强制转换的范围。
我正在尝试使用 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());
}
但是从 Rc<Rc<i32>>
到 Rc<Rc<Borrow<i32>>>
的嵌套强制不编译。
为什么CoerceUnsized
不能递归工作?是否有任何解决方法,例如显式转换?
将 Rc<i32>
转换为 Rc<Borrow<i32>>
只需要在 Rc
旁边添加一个 vtable 指针,它不会影响 [=12= 管理的内存].另一方面,将 Rc<Rc<i32>>
转换为 Rc<Rc<Borrow<i32>>
意味着将 vtable 指针 存储在内部 Rc
旁边。这将需要修改(并扩大)由外部 Rc
管理的内存(即,它实际上需要一个全新的分配)。您可以手动执行此操作,但这远远超出了强制转换的范围。