2017-02-16 1 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

@ Калебмер [разница между '*' и 'Deref'] (http://stackoverflow.com/q/31624743/155423), ** и ** являются специальными в этом случае. – Shepmaster

+1

Я бы хотел, чтобы был явный метод :( –

Смежные вопросы