hello world 示例

  1. fn main() {
  2. // 调用编译生成的可执行文件时,这里的语句将被运行。
  3. // 将文本打印到控制台
  4. println!("Hello World!");
  5. }

编译生成可执行文件: rustc hello.rs 执行:./hello

注释

普通注释:

  1. // 单行注释,注释内容直到行尾。
  2. /* 块注释, 注释内容一直到结束分隔符。 */

文档注释:
其内容会被解析成 HTML 帮助文档。

  1. /// 为接下来的项生成帮助文档。
  2. //! 为注释所属于的项(译注:如 crate、模块或函数)生成帮助文档。

格式化输出

打印操作由 std::fmt 里面所定义的一系列来处理,包括:

  • format!:将格式化文本写到字符串(String)。(译注:字符串是返回值不是参数。)
  • print!:与 format! 类似,但将文本输出到控制台(io::stdout)。
  • println!: 与 print! 类似,但输出结果追加一个换行符。
  • eprint!:与 format! 类似,但将文本输出到标准错误(io::stderr)。
  • eprintln!:与 eprint! 类似,但输出结果追加一个换行符。
  1. fn main() {
  2. println!("{} days", 31);
  3. // 用变量替换字符串有多种写法。
  4. // 比如可以使用位置参数。
  5. println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob");
  6. // 可以使用命名参数。
  7. println!("{subject} {verb} {object}",
  8. object="the lazy dog",
  9. subject="the quick brown fox",
  10. verb="jumps over");
  11. // 可以在 `:` 后面指定特殊的格式。此处为使用二进制
  12. println!("{} of {:b} people know binary, the other half don't", 1, 2);
  13. // 你可以按指定宽度来右对齐文本。
  14. // 下面语句输出 " 1",5 个空格后面连着 1。
  15. println!("{number:>width$}", number=1, width=6);
  16. // 你可以在数字左边补 0。下面语句输出 "000001"。
  17. println!("{number:>0width$}", number=1, width=6);
  18. // 设置小数位的显示
  19. let pi = 3.141592;
  20. println!("Pi {} is {:.3}", "x", pi);
  21. }

std::fmt 包含多种 traits(trait 有 “特征,特性” 等意思) 来控制文字显示,其中重要的两种 trait 的基本形式如下:

  • fmt::Debug:使用 {:?} 标记。格式化文本以供调试使用。
  • fmt::Display:使用 {} 标记。以更优雅和友好的风格来格式化文本。

    调试(Debug)

    标准库中的类型都实现了 fmt::Debug 这个 trait,其他类型可以推导(derive)它的实现。但是 fmt::Display 需要手动实现。
    使用 {:?} 来打印: ``rust // 推导Structurefmt::Debug` 实现。

    [derive(Debug)]

    struct Structure(i32);

// 将 Structure 放到结构体 Deep 中。然后使 Deep 也能够打印。

[derive(Debug)]

struct Deep(Structure);

fn main() { // 使用 {:?} 打印和使用 {} 类似。 但是 {:?} 会有引号 println!(“{:?} months in a year.”, 12); println!(“{1} {0:?} is the {actor} name.”, “Slater”, “Christian”, actor=”actor’s”);

  1. // `Structure` 也可以打印!
  2. println!("Now {:?} will print!", Structure(3));
  3. // 使用 `derive` 的一个问题是不能控制输出的形式。
  4. // 假如我只想展示一个 `7` 怎么办?
  5. println!("Now {:?} will print!", Deep(Structure(7)));

}

  1. 通过 `{:#?}` 提供了 “美化打印” 的功能,会保持原有的样式。
  2. <a name="8gCBZ"></a>
  3. ### [显示(Display)](https://rustwiki.org/zh-CN/rust-by-example/hello/print/print_display.html#%E6%98%BE%E7%A4%BAdisplay)
  4. `fmt::Display` 采用 `{}` 标记,示例:
  5. ```rust
  6. fn main() {
  7. // (使用 `use`)导入 `fmt` 模块使 `fmt::Display` 可用
  8. use std::fmt;
  9. // 定义一个结构体,咱们会为它实现 `fmt::Display`。以下是个简单的元组结构体
  10. // `Structure`,包含一个 `i32` 元素。
  11. struct Structure(i32);
  12. // 为了使用 `{}` 标记,必须手动为类型实现 `fmt::Display` trait。
  13. impl fmt::Display for Structure {
  14. // 这个 trait 要求 `fmt` 使用与下面的函数完全一致的函数签名
  15. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  16. // 仅将 self 的第一个元素写入到给定的输出流 `f`。返回 `fmt:Result`,此
  17. // 结果表明操作成功或失败。注意 `write!` 的用法和 `println!` 很相似。
  18. write!(f, "{}", self.0)
  19. }
  20. }
  21. let s = Structure(666);
  22. println!("{}", s); // 666
  23. }

对于任何非泛型的容器类型, fmt::Display 都能够实现。

fmt::Binary 采用 {:b} 标记。

测试(vector 输出)

  1. use std::fmt; // 导入 `fmt` 模块。
  2. // 定义一个包含单个 `Vec` 的结构体 `List`。
  3. struct List(Vec<i32>);
  4. impl fmt::Display for List {
  5. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  6. // 使用元组的下标获取值,并创建一个 `vec` 的引用。
  7. let vec = &self.0;
  8. write!(f, "[")?;
  9. // 使用 `v` 对 `vec` 进行迭代,并用 `count` 记录迭代次数。
  10. for (count, v) in vec.iter().enumerate() {
  11. // 对每个元素(第一个元素除外)加上逗号。
  12. // 使用 `?` 或 `try!` 来返回错误。
  13. if count != 0 { write!(f, ", ")?; }
  14. write!(f, "{}: {}", count, v)?;
  15. }
  16. // 加上配对中括号,并返回一个 fmt::Result 值。
  17. write!(f, "]")
  18. }
  19. }
  20. fn main() {
  21. let v = List(vec![1, 2, 3]);
  22. println!("{}", v); // [0: 1, 1: 2, 2: 3]
  23. }

格式化

这个格式化的功能是通过 trait 实现的,每种参数类型都对应一种 trait。最常见的格式 化 trait 就是 Display,它可以处理参数类型为未指定的情况,比如 {}

格式化字符串示例:

  1. let foo = 3735928559u32;
  2. let foo1 = format!("{}", foo); // 3735928559
  3. let foo2 = format!("0x{:x}", foo); // 0xdeadbeef
  4. let foo22 = format!("0x{:X}", foo); // 0xDEADBEEF
  5. let foo3 = format!("0o{:o}", foo); // 0o33653337357