E0036#
警告名称:block_label_shadowing
代码块或循环上的标签遮蔽了作用域内已有的标签。
代码块标签和循环标签共享同一个命名空间。在嵌套的代码块或循环上重复使用某个标签名时,内部标签会遮蔽外部标签,使带标签的 break 或 continue 的目标变得不明确。
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
}
}