2017-02-16 18 views
7

bu işlev için uygulama nedir. Aşağıdaki yazım denetimi yapılır: hatası verir. Bu, error[E0133]: dereference of raw pointer requires unsafe function or block hatasını verir. Bir unsafe { ... } bloğunda sarmak onu düzeltir."Box" dan sahip olunan bir değeri nasıl alabilirim?</p> <pre><code>fn unbox<T>(value: Box<T>) -> T { // ??? } </code></pre> <p>ne istiyorum benziyor belgelerinde tek işlevi <code>Box::into_raw</code> geçerli:

Doğru uygulama bu mu? Eğer öyleyse, neden güvensiz? Bu ne demek?

Belki de bu soru, aslında Box s çalışma şeklinin genel belirsizliğini gösteriyor. değeri KQUEUE

+1

Not: Önerilen uygulamanızda, 'Box' tarafından ayrılan belleği sızdırıyorsunuz. –

cevap

11

:

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

yol geri ön-1,0 Rust, yığın ayrılmış değerler çok özel türleri ve onlar (~T olduğu gibi) deseni ~ kullanılır. Rust 1.0'a giden yol boyunca, bu özel muhafazanın çoğu kaldırıldı ... ama hepsi değil.

Bu özel uzmanlık alanı, "deref move" adıyla anılır ve birinci sınıf bir kavram olarak desteklenmesi hakkında bir proto-RFC vardır. O zamana kadar, cevap "Box özel olduğu için" dir.

+0

Bunu neden denemedim? 'Deref' özelliğinin bir '& T' döndürdüğü görülüyor. Operatörün ne yaptığını anlamıyorum, ya da gerçekten özel kutular mı var? – Calebmer

+0

@Calebmer, '' '' '' Deref' '(http://stackoverflow.com/q/31624743/155423), ** ve ** kutuları arasındaki fark bu durumda özeldir. – Shepmaster

+1

Keşke bunun yerine açık bir yöntem olsaydı :( –