この関数の実装は何ですか:
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
sが実際にどのように機能するかについての私の一般的な不確実性を示しています。
値の逆参照:
fn unbox<T>(value: Box<T>) -> T {
*value
}
1.0以前のRustに戻ると、ヒープに割り当てられた値は非常に特殊なタイプであり、シギル~
(~T
)。 Rust 1.0への道に沿って、この特別なケースのほとんどは削除されました...すべてではありません。
この特定の専門分野は「deref move」という名前であり、ファーストクラスの概念としてそれをサポートすることについて proto-RFC があります。それまでは、答えは「Box
が特別だから」です。