Silex v0.47.1 / Docs Source canonique ↗

Exécuter un nettoyage déterministe

Un bloc drop libère une ressource lorsque la valeur qui la possède termine sa durée de vie normale.

Nettoyer une structure

struct File {
    let descriptor:int

    drop {
        print("fermeture ", self.descriptor)
    }
}

func main() {
    {
        let file = File(descriptor:1)
    }
    print("nettoyage terminé")
}

drop s'exécute à la fin déterministe de chaque valeur complète qui n'a pas été transférée. Il ne rend pas la structure non copiable : après var second = first, first et second sont deux valeurs vivantes et chacune exécute son propre bloc exactement une fois.

Une structure exécute son bloc avant de détruire ses champs. Ceux-ci sont détruits dans l'ordre inverse de leur déclaration.

Nettoyer une classe

class Connection {
    drop {
        print("fermée")
    }
}

Le bloc d'une classe s'exécute une fois lorsque la dernière racine atteignable disparaît. Les cycles devenus inatteignables sont eux aussi finalisés. La libération qui rend un composant inatteignable commence son nettoyage, puis les champs possédés propagent le nettoyage à travers ce composant.

Avec l'héritage, les blocs s'exécutent depuis la classe dynamique vers ses bases. drop n'est ni virtuel ni appelable et n'est suivi d'aucun appel explicite à super.

Nettoyer toutes les sorties normales

return, break, continue et la propagation de try nettoient chaque portée qu'ils quittent. Une terminaison fatale avec panic, un échec d'assertion ou une erreur d'exécution ne promet pas ce nettoyage.

Revenir aux types de données · Copier ou transférer une valeur