格式化
format!
let pi = 3.14159265359;
let formatted_pi = format!("The value of pi is approximately {:.2}", pi);
// The value of pi is approximately 3.14
fromat!
将格式化的文本写入 String.
格式化模板中花括号 {...}
占位符会被对应的参数值替代。
println!
println!
与 format!
类似, 不过还会在末尾添加换行符,以及打印到控制台(io::stdout)。
println!("{} students", 25);
// 25 students
// Positional arguments 顺序参数
println!("{0} is a mouse, {1} is a cat. {1} and {0} are friends.", "Jerry", "Tom");
// Jerry is a mouse, Tom is a cat. Tom and Jerry are friends.
// Named arguments 命名参数
println!("{subject} {verb} {object}",
object="the lazy dog",
subject="the quick brown fox",
verb="jumps over");
// the quick brown fox jumps over the lazy dog
// 格式化可以在 ':' 后添加修饰符
let num = 125;
println!("Base 10: {}", num); // 125
println!("Base 2 (binary): {:b}", num); // 1111101,二进制
println!("Base 8 (octal): {:o}", num); // 175,八进制
println!("Base 16 (hexadecimal): {:x}", num); // 7d,十六进制,小写字母
println!("Base 16 (hexadecimal): {:X}", num); // 7D,十六进制,大写字母
Debug trait 调试特征
任何类型想要使用 std::fmt
进行格式化都必须保证自身是 printable(可打印的)。像 fmt::Debug
和 fmt::Display
之类特征帮助类型实现可打印。
任何类型都可以通过 derive
1 属性自动获得 fmt::Debug
特征的实现,从而用于调试。
而 fmt::Display
特征则都需要手动实现,从而得到一个更优雅,更用户友好的展示效果。
// 没有实现任何*可打印*特征,无法打印
struct CustomStruct1(i32);
// `derive` 属性自动获得 `fmt::Debug` 特征实现
// It's printable
#[derive(Debug)]
struct CustomStruct2(i32);
println!("Now {:?} will print!", CustomStruct2(3));
// Now CustomStruct2(3) will print!
可能你已经注意到 fmt::Debug
使用特助的 {:?}
占位符。
Display trait 展示特征
通过实现 fmt::Display
trait 来自定义展示样式非常有用。
use std::fmt;
struct Structure(i32, f64);
// 手动实现 `fmt::Display` trait
// 暂时忽略那些不了解的语法特性,后面章节会学习
impl fmt::Display for Structure {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Int: {}, Float: {}", self.0, self.1)
}
}
fn main() {
let s = Structure(58, 3.14);
println!("{}", s); // Int: 58, Float: 3.14
}
代码挑战
修改编辑器中代码使其打印
Display: 4.2 + 5.8i | Debug: Complex { real: 4.2, imag: 5.8 }
。
Footnotes
-
derive:得到; 获得; (使)产生; 取得; (使)起源。 ↩
Loading...
> 此处输出代码运行结果