E1038

E1038#

无用的 guard,因为模式是不可反驳的。不可反驳的模式意味着它接受所有可能的输入。如果 guard let 中的模式接受所有可能的输入,那么它将总是继续执行,使 guard 无用。

一个常见的错误是,比如你想在某些条件下提前返回,否则继续。然而,由于模式匹配是从前到后评估的,guard let 后的模式将首先被评估,并且总是成功。因此,这样的代码将不起作用,因为所有控制都将继续执行,并且永远不会提前返回。

错误示例#

fn f(input : Int?) -> Int {
  guard let _ = input else {
    Some(_..<0) => abort("Invalid input")
  }
  3
}

fn main {
  ignore(f(None))
}

建议#

如果你希望所有可能的控制流都通过,那么你可以移除 guard,只使用 let 表达式。

fn f(input : Int?) -> Int {
  let _ = input
  3
}

如果你陷入了提前返回的错误,你可以切换到 match 表达式:

fn f(input : Int?) -> Int {
  match input {
    Some(_..<0) => abort("Invalid input")
    _ => ()
  }
  3
}