web-dev-qa-db-ja.com

Rustプログラムをmain関数の外側から早期に終了するにはどうすればよいですか?

Rustでbashクローンを作成中です。ユーザーがexitと入力したときにプログラムを終了させる必要があります。以前のプログラムの反復では、より複雑な機能を追加する前に、returnを使用して、ユーザーに入力を求めていたループから抜け出しました。このロジックは、組み込みのシェル関数を実装する方法のため、関数内にあります。したがって、returnを実行すると、制御ループを短絡させるのではなく、関数から制御ループにジャンプして戻ります。プログラムを終了します。

ユーザーがexitを入力してループを終了すると、おそらくブール値を返すことができると思いますが、少なくともRustにプログラムを早期に終了する方法があるかどうかを知りたいです、JavaのSystem.exit()に似ています。これは、特定のタイプのプログラムに役立つためです。

34
zephyrthenoble

Rust 1.0安定

std::process::exit() まさにそれを行います-指定された終了コードでプログラムを終了します:

use std::process;

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

この関数は、デストラクタを展開して実行することなく、プログラムを即座に終了させるため、慎重に使用する必要があります。

代替(推奨されない)ソリューション

C APIを直接使用できます。追加 libc = "0.2"Cargo.toml、および:

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

RustコンパイラではC関数の呼び出しを確認できないため、これにはunsafeブロックが必要です。プログラムで使用されるリソースは適切に解放されません。これにより、ハングなどの問題が発生する可能性がありますソケット。私が理解している限り、プログラムを終了する適切な方法は、すべてのスレッドを何らかの方法で終了することです。そうすると、プロセスは自動的に終了します。

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

例:

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

古いドキュメントでは、これは失敗と表示されます!

何らかの理由で、このマクロは失敗からパニックに変更されました。パニックは、必要な場合に失敗する方法です。

[編集]すみません。文字列「exit」の入力をテストする必要があるようですが、これは入力の方法(行または引数)によって異なります。次に、出口が検出されたという条件でプログラムをループから抜け出すことができます。

例:

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