web-dev-qa-db-fra.com

Comment puis-je obtenir une valeur détenue d'une «boîte»?

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.

15
Calebmer

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".

31
Shepmaster