是否可以创建RefCell <any>?

时间:2016-02-10 00:13:17

标签: rust

是否可以在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>
}

效果很好。 BoxRefCell似乎都有类似的界限,所以我不太清楚我在这里缺少什么。任何帮助将非常感激。我在Rust Playground中有这个,如果有帮助的话。

2 个答案:

答案 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本身就是大小。

Demonstration.