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` 采用 `{}` 标记,示例:
```rust
fn 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); // 3735928559
let foo2 = format!("0x{:x}", foo); // 0xdeadbeef
let foo22 = format!("0x{:X}", foo); // 0xDEADBEEF
let foo3 = format!("0o{:o}", foo); // 0o33653337357