web-dev-qa-db-fra.com

Comment terminer proprement le programme avec un code de sortie?

Existe-t-il un moyen de retourner un code de sortie dans Rust 1.0?

J'ai essayé env::set_exit_status(exit_code); mais cela génère une erreur de compilation.

Il y a aussi cette question: Quitter Rust program early qui est similaire mais pose des questions sur le cas où le processus doit être quitté tôt.


EDIT: Je recherche une solution qui permettra également au processus de ranger la pile, d'appeler les destructeurs, etc.

36
Thomas Bratt

En construisant sur les commentaires de @ la réponse de FrancisGagné , si vous cherchez un équivalent de C return exit_code, Vous pouvez le construire artificiellement de cette façon:

fn main() {
    let exit_code = real_main();
    std::process::exit(exit_code);
}

fn real_main() -> i32 {
    // the real program here
}

De cette façon, tous les objets de votre programme seront dans la portée de la fonction real_main(), et vous pouvez utiliser en toute sécurité return exit_code; Dans main tout en ayant tous les destructeurs correctement exécutés .

Il serait plus approprié d'utiliser std::env::set_exit_status(..), mais cette fonction n'est pas encore dans Rust stable.

39
Levans

std::process::exit quitte le programme avec le code de sortie spécifié.

10
Francis Gagné

Depuis Rust 1.26, la fonction main n'est plus limitée à (): main peut également renvoyer une Result<(), E> pour tout type E: Debug. Une valeur Ok correspond à EXIT_SUCCESS (qui se trouve être 0 sur toutes les plates-formes) et une valeur Err correspond à EXIT_FAILURE (Qui se trouve être 1 sur toutes les plateformes). La valeur d'erreur est également automatiquement imprimée dans le flux d'erreur standard.

À l'avenir, Rust supportera encore plus de types de retour pour main. Le trait Termination (instable à partir de Rust 1.31.1) définit tous ces types. Le travail du trait consiste à convertir la valeur en un code de sortie i32. Lorsque Termination sera stabilisé, les applications seront naturellement capables de mettre en œuvre ce trait eux-mêmes pour fournir leur propre type de résultat.

5
Francis Gagné