web-dev-qa-db-fra.com

Comment puis-je quitter un programme Rust précocement en dehors de la fonction principale?

Je suis en train d'écrire un clone bash dans Rust. J'ai besoin de quitter mon programme lorsque l'utilisateur tape exit. Dans les itérations précédentes de mon programme, avant d'ajouter des fonctionnalités plus compliquées, j'ai utilisé return pour sortir de la boucle qui invitait l'utilisateur à entrer. Cette logique est maintenant dans une fonction, en raison de la façon dont j'implémente les fonctions Shell intégrées, donc quand je return elle saute simplement de la fonction dans la boucle de contrôle, au lieu de court-circuiter la boucle de contrôle et terminer le programme.

Je me rends compte que je pourrais probablement retourner un booléen lorsque l'utilisateur tape exit et quitter la boucle, mais je voudrais au moins savoir si Rust a un moyen de terminer les programmes plus tôt , similaire à la System.exit() de Java, car elle est utile pour certains types de programmes.

34
zephyrthenoble

Rust 1.0 stable

std::process::exit() fait exactement cela - il termine le programme avec le code de sortie spécifié:

use std::process;

fn main() {
    for i in 0..10 {
        if i == 5 {
            process::exit(1);
        }
        println!("{}", i);
    }
}

Cette fonction provoque l'arrêt immédiat du programme, sans dérouler et exécuter des destructeurs, il doit donc être utilisé avec parcimonie.

Solution alternative (non recommandée)

Vous pouvez utiliser directement l'API C. Ajouter libc = "0.2" à Cargo.toml, et:

fn main() {
    for i in 0..10 {
        if i == 5 {
            unsafe { libc::exit(1); }
        }
        println!("{}", i);
    }
}

L'appel de fonctions C ne peut pas être vérifié par le compilateur Rust, donc cela nécessite le bloc unsafe. Les ressources utilisées par le programme ne seront pas libérées correctement. Cela peut provoquer des problèmes tels que le blocage Si je comprends bien, la bonne façon de quitter le programme est de terminer tous les threads d'une manière ou d'une autre, puis le processus se terminera automatiquement.

47
Vladimir Matveev
panic!("Oh no something bad has happened!")

Exemple:

    if a * g < 0f32 { panic!("The arithmetric-geometric mean is undefined for numbers less than zero!"); }

Dans la documentation plus ancienne, vous verrez cela comme un échec! ("Oh, il ne s'est rien passé de mal ici.")

Pour une raison quelconque, cette macro est passée d'échec à panique. La panique est le moyen d'échouer, si vous le devez.

[modifier] Je suis désolé. Il semble que vous devriez tester l'entrée pour la chaîne "exit", qui dépendra de la façon dont vous prenez l'entrée (par ligne ou par arguments). Ensuite, vous pouvez faire sortir le programme de la boucle à condition que la sortie soit détectée.

Exemple:

loop {
    if exit_found { break }
    else {
        // your thing, which also looks for exit_found
    }
}
0
Rentsy