格式化输出是由定义于std::fmt
中的一系列宏
来进行处理的,包括下面所列的部分宏:
format!
: 格式化 字符串(String)
。
print!
: 类似于format!
,但文本只打印到控制台。
println!
: 类似于print!
,但是会追加新行。
跟所有文本解析风格相似,rust的亮点在于格式的正确性会在编译期进行检查。
fn main() {
// 一般来说, `{}` 会自动替换任何参数。
println!("{} days", 31);
// 没有后缀,31默认是i32。你可以使用后缀来改变31的类型。
// 有多种可选模型。位置参数也可用。
println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob");
// 以及命名参数。
println!("{subject} {verb} {object}",
object="the lazy dog",
subject="the quick brown fox",
verb="jumps over");
// 特殊格式可以在`:`后面指定。
println!("{} of {:b} people know binary, the other half don't", 1, 2);
// 你也能通过指定宽度来对文本进行右对齐。
// 将会输出 " 1"
// "1"前面有5个空格。
println!("{number:>width$}", number=1, width=6);
// 你也可以填充0,会输出"000001".
println!("{number:>0width$}", number=1, width=6);
// 甚至还可以检查参数个数是否正确
println!("My name is {0}, {1} {0}", "Bond");
// FIXME ^ 添加确实的参数: "James"
// 创建一个包含了`i32`类型参数的名为 `Structure`的结构体(structure
struct Structure(i32);
// 然后,诸如这样自定义类型的结构体则需要更复杂的处理。
// 该行代码将无法执行。
println!("This struct `{}` won't print...", Structure(3));
// FIXME ^ 注释掉这行。
}
std::fmt
包含了很多控制文本显示的traits
。下面列出两个重要的基本形式:
fmt::Debug
: 使用 {:?}
标记,以便于调试。
fmt::Display
: 使用{}
标记,以优雅、用户友好的方式来格式化文本。
这里使用fmt::Display
是因为标准库提供了这种类型的很多实现。要打印自定义类似的文本,则需要做更多的工作。
Activities
- 修改上方代码中的两个问题 (看FIXME) ,让代码正确运行。
- 添加
println!
宏来输出: Pi is roughly 3.143
, 用22/7来生成Pi的值。 (提示:你可能需要检查std::fmt
文档来设置显示的小数精度)
更多文档
std::fmt
, macros
, struct
,
以及 traits