web-dev-qa-db-ja.com

Rust main関数に戻り値がないのはなぜですか、とにかく値を返す方法は?

Rustでは、メイン関数は次のように定義されています。

_fn main() {

}
_

ただし、この関数は戻り値を許可しません。言語が戻り値を許可しないのはなぜですか?とにかく何かを返す方法はありますか? C exit(int)関数を安全に使用できますか、それともリークなどが発生しますか?

28
Jeroen

Rust 1.26 の時点で、mainResultを返すことができます。

_use std::fs::File;

fn main() -> Result<(), std::io::Error> {
    let f = File::open("bar.txt")?;

    Ok(())
}
_

この場合に返されるエラーコードは、エラーの場合は1です。代わりにFile::open("bar.txt").expect("file not found");を使用すると、エラー値101が返されます(少なくとも私のマシンでは)。

また、より一般的なエラーを返したい場合は、次を使用します。

_use std::error::Error;
...

fn main() -> Result<(), Box<dyn Error>> {
   ...
}
_
11
0 0

std::process::exit(code: i32) は、コードで終了する方法です。


Rustはこのようにして、プログラムから値を返すための一貫した明示的なインターフェイスがどこから設定されていても存在するようにします。 mainが一連のタスクを開始する場合、mainが終了した場合でも、これらのいずれかが戻り値を設定できます。

Rustには、値を返すmain関数を作成する方法がありますが、通常はstdlib内で抽象化されます。詳細については、 stdlibなしで実行可能ファイルを作成するためのドキュメント を参照してください。

14
timlyo

他の人が指摘したように、 std::process::exit(code: i32) がここに行く方法です

理由の詳細については、 RFC 1011:プロセス終了 を参照してください。 RFCについての議論は RFCのプルリクエスト にあります。

5
Melle

これに関するredditスレッド には「理由」の説明があります。

錆は確かにこれを行うように設計することができます。それは実際に使用していました。

しかし、タスクモデルRustを使用しているため、fnメインタスクは他のタスクの束を開始して終了する可能性があります!しかし、他のタスクの1つは、メインが終了した後にOS終了コードを設定する場合があります去って。

Set_exit_statusの呼び出しは明示的で簡単であり、特に気にしない場合はメインの下部に常に0を置く必要はありません。

4
Jack O'Connor

戻り値はstd::os::set_exit_statusで設定できます。

1
A.B.