前言
rust
的风最终还是吹到了前端,前端工具在 rust
这股春风下不断涌现。如 oxlint
(基于 rust
的代码 linter
工具)、rolldown
与 rspack
(基于 rust
的代码打包工具)、swc
(基于 rust
开发的一系列编译、打包、压缩等工具)、tauri
(基于 rust
构建桌面应用的框架)等。这些工具在 rust
这股春风的吹拂下如雨后春笋一般,应接不暇。今天我们也借着这股风,开始学习 rust
这个强势的语言。为什么首先学习注释和打印呢?因为我们知道一段优秀的代码除了见名知意的命名外,好的注释也很重要,可以帮助使用者清晰的了解代码的意图且便于团队协作。log
的能力对前端的代码调试和问题定位提供很大的助力,因此如何在 rust
中花式的使用 log
能力对我我们前端学习 rust
也是很有意义的。因此,这里咱们从花式println和注释来开始 rust
的学习之旅。
注释
rust
的注释可以分为三类代码注释、文档注释、包和模块注释,但包和模块注释严格来讲也是文档注释的一种。严格来讲 rust
仅有代码注释、文档注释这几种注释方式。
代码注释
代码注释分为行注释 //
和块注释 /* */
。
// 单行注释,注释内容直到行尾
// 这是 Person 结构体
struct Person {
name: String,
age: u8,
}
fn main() {
let name = String::from("Peter");
let age = 27;
/*
* 块注释,注释内容一直到结束分隔符
* 这是 peter 人的声明
*/
let peter = Person { name, age };
}
文档注释
文档注释用于为代码提供文档和说明,支持 markdown
写法,运行 cargo doc
可以将文档注释转换成 HTML
网页文件,最终展示给用户浏览。
/// 计算两个数之和
/// #[test]
/// fn it_works() {
/// assert_eq!(2 + 2, 4);
/// }
/// # 参数
/// - `a`: 第一个参数
/// - `b`: 第二个参数
/// # 返回值
/// 返回两个数之和
fn add(a: i32, b: i32) -> i32 {
a + b
}
fn main() {
let sum = add(7, 8);
println!("sum = {}", sum);
}
格式化输出
提到 rust
的打印首先想到的肯定就是 {}
,但实际上 rust
的打印操作由 std::fmt
里面所定义的一系列 宏
来处理。提供很多中格式化输出的方式。
print!
:将格式化文本输出到控制台;println!
:将格式化文本输出到控制台且追加换行符;format!
:将格式化文本输出到String
字符串;eprint!
:与print!
类似,但将文本输出到标准错误(io::stderr)。eprintln!
:与eprint!
类似,但输出结果追加一个换行符。
/// 计算两个数之和
/// #[test]
/// fn it_works() {
/// assert_eq!(2 + 2, 4);
/// }
/// # 参数
/// - `a`: 第一个参数
/// - `b`: 第二个参数
/// # 返回值
/// 返回两个数之和
fn add(a: i32, b: i32) -> i32 {
a + b
}
fn main() {
let sum = add(7, 8);
println!("sum = {}", sum);
eprintln!("Error stack is full");
let s = "hello";
let rust_string = format!("{}, world", s);
eprint!("Error stack is empty");
print!("string = {}", rust_string);
}
结果输出:
格式化占位符
rust
除了最能想到的 {}
以外, rust
还支持 {:?}
与 {:#?}
这两个格式化输出占位符。 {:#?}
与 {:?}
几乎一样,唯一的区别在于它能更优美地输出内容。rust
中所有的类型,若想用 std::fmt
的进行格式化打印,都要求实现至少一个可打印的 traits
。仅有一些类型提供了自动实现,比如 std
库中的类型。除此之外其他类型都必须手动实现。
#[allow(dead_code)]
#[derive(Debug)]
struct Person {
name: String,
age: u8
}
fn main() {
let i = 3.1415926;
let s = String::from("hello");
let v = vec![1, 2, 3];
let p = Person{name: "sunface".to_string(), age: 18};
println!("{:?}, {:?}, {:#?}, {:?}", i, s, v, p);
}
结果输出:
输出占位符
rust
针对格式化输出提供一系列的输出占位符号。位置参数、具名参数、格式化参数。
// 位置参数
fn main() {
let a = 5;
let b = 6;
println!("b is {1}, a is {0}", a, b);
}
// 具名参数
fn main() {
println!("{name} {}", 1, name = 2);
}
// 格式化参数
fn main() {
let v = 3.1415926;
// 保留小数点后两位 => 3.14
println!("{:.2}", v);
// 带符号保留小数点后两位 => +3.14
println!("{:+.2}", v);
// 不带小数 => 3
println!("{:.0}", v);
// 通过参数来设定精度 => 3.1416,相当于{:.4}
println!("{:.1$}", v, 4);
}
总结
注释对任何程序都不可缺少,打印对程序调试是大有裨益。从注释和打印开始 rust
的学习旅程。