Skip to content

G.TYP.BOL.01 不宜使用块表达式作为控制表达式

【级别】 要求

【描述】

使用块表达式作为控制表达式,易引入带副作用的函数调用,导致程序运行逻辑和预期不符,代码的可 读性也同步变差。

Rust中的控制表达式包括:

  • if语句
  • while语句
  • match语句

【反例】

Rust
// 不符合:可读性差,条件表达式容易被误认为是执行分支
if {
  let filename = get_input_from_user();
  let cur_dir = std::env::current_dir().unwrap(); let filepath = cur_dir.join(filename);
  std::fs::OpenOptions::new() 
    .create_new(true)
    .open(filepath) 
    .is_ok()
} {
    // ...
}

【正例】

Rust
fn create_new_user_file() -> bool {
  let filename = get_input_from_user();
  let cur_dir = std::env::current_dir().unwrap(); let filepath = cur_dir.join(filename);
  std::fs::OpenOptions::new() 
    .create_new(true)
    .open(filepath) 
    .is_ok()
}

// 符合
if create_new_user_file() {
    // ...
}

【反例】

Rust
fn main() {
  // 不符合:使用块表达式
  match {
    println!("side effect"); std::env::var("PATH")
  } {
    Ok(_) => (), 
    _ => (),
  } 
}

【正例】

Rust
fn main() {
  // 符合
  match std::env::var("PATH") {
    Ok(_) => (), 
    _ => (),
  } 
}