E0036

E0036#

警告名称:block_label_shadowing

代码块或循环上的标签遮蔽了作用域内已有的标签。

代码块标签和循环标签共享同一个命名空间。在嵌套的代码块或循环上重复使用某个标签名时,内部标签会遮蔽外部标签,使带标签的 breakcontinue 的目标变得不明确。

break 既可以指向代码块也可以指向循环,而 continue 只能指向循环;因此,标签遮蔽可能把控制流导向与预期不同的结构。请为嵌套代码块和循环的标签使用不同且含义明确的名称。

错误示例#

///|
fn has_positive(xs : Array[Int]) -> Bool {
  found~: {
    // Warning: The label name `found` shadows a label name that is already in scope.
    found~: for x in xs {
      if x > 0 {
        break found~
      }
    }
    false
  }
}

建议#

为嵌套的代码块和循环使用不同且含义明确的标签名称,使每个控制流目标都清晰无歧义。

///|
fn has_positive(xs : Array[Int]) -> Bool {
  found~: {
    search~: for x in xs {
      if x > 0 {
        break found~ true
      }
      continue search~
    }
    false
  }
}