我注意到,?Sized是在类型参数绑定T某些功能(borrow,borrow_state,和borrow_mut),但是,它是不是一个界new或into_inner.如果我不能创建一个RefCell包含动态大小(RefCell<T : ?Sized>)的东西,那么它具有可以在这样的东西上运行的函数有什么用呢?
该支持是在还添加了测试的提交中添加的。我们可以查看这些测试来了解它的预期用途:
use std::cell::RefCell;
#[test]
fn refcell_unsized() {
let cell: &RefCell<[i32]> = &RefCell::new([1, 2, 3]);
{
let b = &mut *cell.borrow_mut();
b[0] = 4;
b[2] = 5;
}
let comp: &mut [i32] = &mut [4, 2, 5];
assert_eq!(&*cell.borrow(), comp);
}
Run Code Online (Sandbox Code Playgroud)
您始终需要有一个带有Sized界限的构造函数,因为编译器需要知道要在堆栈上分配的空间量。一旦你有了它,你就可以强制转换为动态大小的类型。