web-dev-qa-db-ja.com

出力をstderrに送信する方法は?

これを使用して、出力をstdoutに送信します。

println!("some output")

Stderrに対して同じことを行う対応するマクロはないと思います。

39
Tshepang

後Rust 1.19

Rust 1.19では、 eprint および eprintln マクロを使用できます。

_fn main() {
    eprintln!("This is going to standard error!, {}", "awesome");
}
_

これは元々 RFC 1896 で提案されました。

Before Rust 1.19

実装の_println!_ を見て、どのように機能するかを詳しく見てみましょうが、最初に読んだときは少し圧倒されました。

ただし、同様のマクロを使用して、stderrにフォーマットできます。

_use std::io::Write;

let name = "world";
writeln!(&mut std::io::stderr(), "Hello {}!", name);
_

ただし、IO)は失敗する可能性があるため、これは_unused result which must be used_警告を表示しますこの場合、既存のメソッド 単にパニック を確認できるため、同じようにコードを更新できます。

_use std::io::Write;

let name = "world";
let r = writeln!(&mut std::io::stderr(), "Hello {}!", name);
r.expect("failed printing to stderr");
_

これは少し多いので、マクロでラップしてみましょう。

_use std::io::Write;

macro_rules! println_stderr(
    ($($arg:tt)*) => { {
        let r = writeln!(&mut ::std::io::stderr(), $($arg)*);
        r.expect("failed printing to stderr");
    } }
);

fn main() {
    let name = "world";
    println_stderr!("Hello {}!", name)
}
_
69
Shepmaster

print! および println! は、標準出力に書き込むための便利なメソッドです。さまざまなタスクで使用できる同じフォーマット機能を持つ他のマクロがあります。

標準エラーストリームに書き込むには、たとえばwriteln! このような:

use std::io::Write;

fn main() {
    let mut stderr = std::io::stderr();
    writeln!(&mut stderr, "Error!").unwrap();
}
19
Francis Gagné

それはそうです:

use std::io::Write;

fn main() {
    std::io::stderr().write(b"some output\n");
}

プログラムの出力を/dev/nullに送信してテストして、機能することを確認できます(警告は無視します)。

$ rustc foo.rs && ./foo > /dev/null
foo.rs:4:5: 4:42 warning: unused result which must be used, #[warn(unused_must_use)] on by default
foo.rs:4     io::stderr().write(b"some output\n");
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
some output

同様に、stdoutに対して以下を行うことができます。

use std::io::Write;

fn main() {
    std::io::stdout().write(b"some output\n");
}

これはprintln!が単に便利であることを意味すると思います:それはより短く、またいくつかのフォーマットを許可します。後者の例として、以下は0x400を表示します:

println!("0x{:x}", 1024u)
3
Tshepang

正確な質問に答えているわけではありませんが、他のクレートのレベルロギングのインターフェースを指定するlogクレートがあることは興味深いかもしれません(例:env_logger)を満たすことができます。

そのようなロギングの出力はstderrに送信され、ログレベルを指定するなど、ユーザーにとって追加の利点があります。

これは、そのようなロガーの使用方法の例です。

#[macro_use]
extern crate log;
extern crate env_logger;

fn main() {
    env_logger::init().unwrap();
    error!("this is printed by default");
}

http://burntsushi.net/rustdoc/env_logger/index.html#example からの例)

3
Michael

ゴール

stderr!("Code {}: Danger, Will Robinson!  Danger!", 42);

ノート

他の回答では、最新の夜間に未使用のインポート警告が生成されるため、Just Works TMという最新のマクロがあります。

コード

macro_rules! stderr {
    ($($arg:tt)*) => (
        use std::io::Write;
        match writeln!(&mut ::std::io::stderr(), $($arg)* ) {
            Ok(_) => {},
            Err(x) => panic!("Unable to write to stderr (file handle closed?): {}", x),
        }
    )
}
0
user246672