E0017

E0017#

标识符的使用存在歧义。如果它指的是循环变量,请使用 as <id> 在模式中绑定它。如果它指的是变量在进入循环前的原始值,请在循环外部将其绑定到一个新的绑定器。

错误示例#

///|
fn main {
  let a : @string.View = "asdf"
  loop a {
    [_, .. d] => {
      println(a)
      //      ^
      // Warning: The usage of 'a' is ambiguous. If it refers to the loop
      // variable, please use `as a` to bind it in the pattern. If it refers to
      // the original value of 'a' before entering the loop, please bind it to a
      // new binder outside the loop.
      continue d
    }
    [] => ()
  }
}

Output:

asdf
asdf
asdf
asdf

因为 a 指的是进入循环前的 a 的值,因此该值始终相同。

建议#

在许多情况下,您可能需要引用随循环迭代而变化的循环变量。如果需要,请使用 as <id> 将其绑定到模式中。

///|
fn main {
  let a : @string.View = "asdf"
  loop a {
    [_, .. d] as a => {
      println(a)
      continue d
    }
    [] => ()
  }
}

Output:

asdf
sdf
df
f

或者,如果你想在进入循环之前引用变量的原始值,可以显式地将其绑定到循环外的另一个名称。

///|
fn main {
  let a : @string.View = "asdf"
  let b = a
  loop a {
    [_, .. d] => {
      println(b)
      continue d
    }
    [] => ()
  }
}

Output:

asdf
asdf
asdf
asdf