【🔥前端学rust】花式println和注释

178 阅读4分钟

前言

rust 的风最终还是吹到了前端,前端工具在 rust 这股春风下不断涌现。如 oxlint (基于 rust 的代码 linter 工具)、rolldownrspack (基于 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);
}

结果输出: image.png

格式化占位符

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);
}

结果输出: image.png

输出占位符

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 的学习旅程。