2016-02-10 83 views
4

是否有可能在Rust中創建RefCell<Any>類型的東西?我試過如下:是否可以創建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中有這個。

回答

5

Box具有性狀std::ops::CoerceUnsized,其允許投射到Box<Any>RefCell沒有,所以你不能。

當然,你可以這樣做:

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

所以,你可以有一個RefCell<Any>,但不能構建一個或強迫一個,只有強制引用。

3

RefCell<Any>是未分類的類型;你不能有一個未定型的實際實例 - 需要多少堆棧空間?這與您不能返回Any的方式相同,但必須返回Box<Any>;所以你也不能返回RefCell<Any>,但必須返回類似Rc<RefCell<Any>>RefCell<Box<Any>>等也可以正常工作,因爲尺寸類型的RefCell本身大小。

Demonstration.