pub struct Arguments<'a> { /* private fields */ }
Expand description
该结构体表示格式字符串及其参数的安全预编译版本。 由于无法安全地完成此操作,因此无法在运行时生成该文件,因此未提供任何构造函数,并且该字段为私有字段以防止修改。
format_args!
宏将安全地创建此结构体的实例。
宏在编译时验证格式字符串,因此可以安全地执行 write()
和 format()
函数的使用。
您可以在 Debug
和 Display
上下文中使用 format_args!
返回的 Arguments<'a>
,如下所示。
该示例还显示 Debug
和 Display
的格式相同: format_args!
中的插值格式字符串。
let debug = format!("{:?}", format_args!("{} foo {:?}", 1, 2));
let display = format!("{}", format_args!("{} foo {:?}", 1, 2));
assert_eq!("1 foo 2", display);
assert_eq!(display, debug);
RunImplementations§
source§impl<'a> Arguments<'a>
impl<'a> Arguments<'a>
1.52.0 (const: unstable) · sourcepub fn as_str(&self) -> Option<&'static str>
pub fn as_str(&self) -> Option<&'static str>
获取格式化后的字符串,如果它没有要在运行时格式化的参数。
在某些情况下,这可用于避免分配。
Guarantees
对于 format_args!("just a literal")
,这个函数保证返回 Some("just a literal")
。
对于大多数带有占位符的情况,这个函数将返回 None
。
但是,编译器可能会执行优化,即使格式字符串包含占位符,也会导致此函数返回 Some(_)
。
例如,format_args!("Hello, {}!", "world")
可能被优化为 format_args!("Hello, world!")
,这样 as_str()
返回 Some("Hello, world!")
。
除了微不足道的情况 (没有占位符) 之外的任何行为都不能得到保证,并且除了优化之外不应依赖于任何其他行为。
Examples
use std::fmt::Arguments;
fn write_str(_: &str) { /* ... */ }
fn write_fmt(args: &Arguments<'_>) {
if let Some(s) = args.as_str() {
write_str(s)
} else {
write_str(&args.to_string());
}
}
Runassert_eq!(format_args!("hello").as_str(), Some("hello"));
assert_eq!(format_args!("").as_str(), Some(""));
assert_eq!(format_args!("{:?}", std::env::current_dir()).as_str(), None);
Run