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
}