hello world 示例
fn main() {// 调用编译生成的可执行文件时,这里的语句将被运行。// 将文本打印到控制台println!("Hello World!");}
编译生成可执行文件: rustc hello.rs 执行:./hello
注释
普通注释:
// 单行注释,注释内容直到行尾。/* 块注释, 注释内容一直到结束分隔符。 */
文档注释:
其内容会被解析成 HTML 帮助文档。
/// 为接下来的项生成帮助文档。//! 为注释所属于的项(译注:如 crate、模块或函数)生成帮助文档。
格式化输出
打印操作由 std::fmt 里面所定义的一系列宏来处理,包括:
format!:将格式化文本写到字符串(String)。(译注:字符串是返回值不是参数。)print!:与format!类似,但将文本输出到控制台(io::stdout)。println!: 与print!类似,但输出结果追加一个换行符。eprint!:与format!类似,但将文本输出到标准错误(io::stderr)。eprintln!:与eprint!类似,但输出结果追加一个换行符。
fn main() {println!("{} days", 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",5 个空格后面连着 1。println!("{number:>width$}", number=1, width=6);// 你可以在数字左边补 0。下面语句输出 "000001"。println!("{number:>0width$}", number=1, width=6);// 设置小数位的显示let pi = 3.141592;println!("Pi {} is {:.3}", "x", pi);}
std::fmt 包含多种 traits(trait 有 “特征,特性” 等意思) 来控制文字显示,其中重要的两种 trait 的基本形式如下:
fmt::Debug:使用{:?}标记。格式化文本以供调试使用。fmt::Display:使用{}标记。以更优雅和友好的风格来格式化文本。调试(Debug)
标准库中的类型都实现了fmt::Debug这个trait,其他类型可以推导(derive)它的实现。但是fmt::Display需要手动实现。
使用{:?}来打印:``rust // 推导Structure的fmt::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”);
// `Structure` 也可以打印!println!("Now {:?} will print!", Structure(3));// 使用 `derive` 的一个问题是不能控制输出的形式。// 假如我只想展示一个 `7` 怎么办?println!("Now {:?} will print!", Deep(Structure(7)));
}
通过 `{:#?}` 提供了 “美化打印” 的功能,会保持原有的样式。<a name="8gCBZ"></a>### [显示(Display)](https://rustwiki.org/zh-CN/rust-by-example/hello/print/print_display.html#%E6%98%BE%E7%A4%BAdisplay)`fmt::Display` 采用 `{}` 标记,示例:```rustfn main() {// (使用 `use`)导入 `fmt` 模块使 `fmt::Display` 可用use std::fmt;// 定义一个结构体,咱们会为它实现 `fmt::Display`。以下是个简单的元组结构体// `Structure`,包含一个 `i32` 元素。struct Structure(i32);// 为了使用 `{}` 标记,必须手动为类型实现 `fmt::Display` trait。impl fmt::Display for Structure {// 这个 trait 要求 `fmt` 使用与下面的函数完全一致的函数签名fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {// 仅将 self 的第一个元素写入到给定的输出流 `f`。返回 `fmt:Result`,此// 结果表明操作成功或失败。注意 `write!` 的用法和 `println!` 很相似。write!(f, "{}", self.0)}}let s = Structure(666);println!("{}", s); // 666}
对于任何非泛型的容器类型, fmt::Display 都能够实现。
测试(vector 输出)
use std::fmt; // 导入 `fmt` 模块。// 定义一个包含单个 `Vec` 的结构体 `List`。struct List(Vec<i32>);impl fmt::Display for List {fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {// 使用元组的下标获取值,并创建一个 `vec` 的引用。let vec = &self.0;write!(f, "[")?;// 使用 `v` 对 `vec` 进行迭代,并用 `count` 记录迭代次数。for (count, v) in vec.iter().enumerate() {// 对每个元素(第一个元素除外)加上逗号。// 使用 `?` 或 `try!` 来返回错误。if count != 0 { write!(f, ", ")?; }write!(f, "{}: {}", count, v)?;}// 加上配对中括号,并返回一个 fmt::Result 值。write!(f, "]")}}fn main() {let v = List(vec![1, 2, 3]);println!("{}", v); // [0: 1, 1: 2, 2: 3]}
格式化
这个格式化的功能是通过 trait 实现的,每种参数类型都对应一种 trait。最常见的格式 化 trait 就是 Display,它可以处理参数类型为未指定的情况,比如 {}。
格式化字符串示例:
let foo = 3735928559u32;let foo1 = format!("{}", foo); // 3735928559let foo2 = format!("0x{:x}", foo); // 0xdeadbeeflet foo22 = format!("0x{:X}", foo); // 0xDEADBEEFlet foo3 = format!("0o{:o}", foo); // 0o33653337357
