Rust by Example中文

1.2 Formatted print

格式化输出是由定义于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