能否创建一个 RefCell<Any>?

5
在Rust中是否可以创建类型为RefCell<Any>的东西?我尝试了以下代码:
fn test2<T : Any>(x : T) -> RefCell<Any>{
    return RefCell::new(x) as RefCell<Any>
}

但是我收到了以下错误信息:

error: the trait `core::marker::Sized` is not implemented for the type `core::any::Any + 'static` [E0277]
<anon>:8 fn test2<T : Any>(x : T) -> RefCell<Any>{
RefCell 的文档包括以下内容:
pub struct RefCell<T> where T: ?Sized {
    // some fields omitted
}

这让我相信(以及来自这个问题的答案)这样的事情是可能的。我也尝试了:

fn test1<T : Any>(x : T) -> Box<Any>{
    return Box::new(x) as Box<Any>
}

这个代码运行得很好。 BoxRefCell 看起来有相似的限制,所以我不太确定我错在哪里。非常感谢任何帮助。如果有帮助的话,我把它放在了Rust Playground中。

2个回答

7

Box有trait std::ops::CoerceUnsized,可以将其转换为Box<Any>。而RefCell则没有这个功能,所以你不能这样做。

当然,你可以这样做:

let x = RefCell::new( String::new() );
let x = &x as &RefCell<Any>;

因此,您可以拥有一个RefCell<Any>,但不能构造或强制转换为它,只能强制转换引用。

4

RefCell<Any> 是一个不定长类型;你不能拥有一个实际的不定长类型实例 —— 它需要多少堆栈空间?这与你不能返回 Any 一样,而必须返回 Box<Any> 一样;因此,你也不能返回 RefCell<Any>,而必须返回像 Rc<RefCell<Any>> 这样的东西。例如 RefCell<Box<Any>> 就能正常工作,因为一个大小已知的类型的 RefCell 本身是有大小的。

演示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接