Quelle est l'implémentation de cette fonction:
fn unbox<T>(value: Box<T>) -> T {
// ???
}
La seule fonction dans la documentation qui ressemble à ce que je veux est Box::into_raw
. Les éléments suivants taperont check:
fn unbox<T>(value: Box<T>) -> T {
*value.into_raw()
}
Cela donne l'erreur error[E0133]: dereference of raw pointer requires unsafe function or block
. Envelopper dans un unsafe { ... }
block le corrige.
fn unbox<T>(value: Box<T>) -> T {
unsafe { *value.into_raw() }
}
Est-ce la bonne mise en œuvre? Si oui, pourquoi est-il dangereux? Qu'est-ce que ça veut dire?
Peut-être que cette question montre mon incertitude générale sur le fonctionnement réel de Box
.
Déréférencer la valeur:
fn unbox<T>(value: Box<T>) -> T {
*value
}
En arrière dans la rouille antérieure à 1.0, les valeurs allouées en tas étaient des types très spéciaux , et ils utilisaient le sigil ~
(un péché ~T
). Sur la route de Rust 1.0, la plupart de ces boîtiers spéciaux ont été supprimés ... mais pas tout.
Cette spécialité particulière porte le nom de "deref move", et il y a proto-RFC à propos du support en tant que concept de première classe. D'ici là, la réponse est "parce que Box
est spécial".