Macro std::write

1.0.0 · source ·
macro_rules! write {
    ($dst:expr, $($arg:tt)*) => { ... };
}
Expand description

将格式化的数据写入缓冲区。

该宏接受 ‘writer’,格式字符串和参数列表。 参数将根据指定的格式字符串进行格式化,并将结果传递到 writer。 使用 write_fmt 方法时,writer 可以是任何值; 通常,这来自 fmt::Writeio::Write trait 的实现。 宏返回 write_fmt 方法返回的任何内容; 通常是 fmt::Resultio::Result

有关格式字符串语法的更多信息,请参见 std::fmt

Examples

use std::io::Write;

fn main() -> std::io::Result<()> {
    let mut w = Vec::new();
    write!(&mut w, "test")?;
    write!(&mut w, "formatted {}", "arguments")?;

    assert_eq!(w, b"testformatted arguments");
    Ok(())
}
Run

模块可以同时在实现两者的对象上导入 std::fmt::Writestd::io::Write 以及调用 write!,因为对象通常不会同时实现两者。

但是,模块必须避免 trait 名称之间的冲突,例如将它们导入为 _ 或以其他方式重命名它们:

use std::fmt::Write as _;
use std::io::Write as _;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut s = String::new();
    let mut v = Vec::new();

    write!(&mut s, "{} {}", "abc", 123)?; // 使用 fmt::Write::write_fmt
    write!(&mut v, "s = {:?}", s)?; // 使用 io::Write::write_fmt
    assert_eq!(v, b"s = \"abc 123\"");
    Ok(())
}
Run

如果您还需要 trait 名称本身,例如在您的类型上实现一个或两个,请导入包含模块,然后用前缀命名它们:

use std::fmt::{self, Write as _};
use std::io::{self, Write as _};

struct Example;

impl fmt::Write for Example {
    fn write_str(&mut self, _s: &str) -> core::fmt::Result {
         unimplemented!();
    }
}
Run

Note: 该宏也可以在 no_std 设置中使用。 在 no_std 设置中,您负责组件的实现细节。

use core::fmt::Write;

struct Example;

impl Write for Example {
    fn write_str(&mut self, _s: &str) -> core::fmt::Result {
         unimplemented!();
    }
}

let mut m = Example{};
write!(&mut m, "Hello World").expect("Not written");
Run