是否可以在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
}
这让我相信(以及this问题的回答)这样的事情是可能的。我也尝试过:
fn test1<T : Any>(x : T) -> Box<Any>{
return Box::new(x) as Box<Any>
}
效果很好。 Box
和RefCell
似乎都有类似的界限,所以我不太清楚我在这里缺少什么。任何帮助将非常感激。我在Rust Playground中有这个,如果有帮助的话。
答案 0 :(得分:5)
Box
具有特征std::ops::CoerceUnsized
,允许转换为Box<Any>
。 RefCell
没有,所以你不能。
当然你可以这样做:
let x = RefCell::new( String::new() );
let x = &x as &RefCell<Any>;
所以你可以拥有一个RefCell<Any>
,但不能构造一个或强制一个,只能强制引用。
答案 1 :(得分:3)
RefCell<Any>
是未分类的类型;你不能拥有一个未实现类型的实际实例 - 需要多少堆栈空间?这与您无法返回Any
的方式相同,但必须返回Box<Any>
;所以你也不能返回RefCell<Any>
但必须返回Rc<RefCell<Any>>
之类的东西。类似RefCell<Box<Any>>
的工作也可以正常工作,因为大小类型的RefCell
本身就是大小。