2017-02-16 12 views
7

,這是什麼功能的實現:如何從「Box」中獲得自有價值?

fn unbox<T>(value: Box<T>) -> T { 
    // ??? 
} 

,看起來像我想要的文檔中的唯一功能是Box::into_raw。以下將鍵入檢查:

fn unbox<T>(value: Box<T>) -> T { 
    *value.into_raw() 
} 

這給出了錯誤error[E0133]: dereference of raw pointer requires unsafe function or block。用unsafe { ... }塊包裝它可以修復它。

fn unbox<T>(value: Box<T>) -> T { 
    unsafe { *value.into_raw() } 
} 

這是正確的實現嗎?如果是這樣,爲什麼它不安全?這是什麼意思?

也許這個問題表明我對Box實際工作的一般不確定性。

+1

注意:在你提出的實現中,你正在泄漏由'Box'分配的內存。 –

回答

11

解除引用所述值:

fn unbox<T>(value: Box<T>) -> T { 
    *value 
} 

早在預1.0鏽,堆分配值分別爲非常特殊類型,以及它們所用的印記~(如在~T)。沿着Rust 1.0的道路,大部分這種特殊的外殼被拆除了......但並非全部。

這個特殊的專業名稱是「deref move」,有一個支持它作爲一流概念的proto-RFC。在此之前,答案是「因爲Box是特殊的」。

+0

爲什麼我不試試? 'Deref'特性似乎返回一個'&T'。我不明白'*'操作符的作用,還是盒子真的很特別? – Calebmer

+0

@Calebmer在[*'和'Deref'](http://stackoverflow.com/q/31624743/155423)之間有區別,**和**框在這種情況下是特殊的。 – Shepmaster

+1

我希望有一個明確的方法,而不是:( –