web-dev-qa-db-ja.com

「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() }
}

これは正しい実装ですか?もしそうなら、なぜそれは安全ではないのですか?どういう意味ですか?

おそらく、この質問は、Boxsが実際にどのように機能するかについての私の一般的な不確実性を示しています。

15
Calebmer

値の逆参照:

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

1.0以前のRustに戻ると、ヒープに割り当てられた値は非常に特殊なタイプであり、シギル~~T)。 Rust 1.0への道に沿って、この特別なケースのほとんどは削除されました...すべてではありません。

この特定の専門分野は「deref move」という名前であり、ファーストクラスの概念としてそれをサポートすることについて proto-RFC があります。それまでは、答えは「Boxが特別だから」です。

31
Shepmaster