Scala Шаблон переменной: переменная не назначена - PullRequest
1 голос
/ 10 января 2020

В Scala for the impatient (2nd Edition) автор говорит:

Если за ключевым словом case следует имя переменной, то этой переменной присваивается выражение соответствия.

Кроме того, подобное утверждение дано в Программирование Scala, 2-е издание .

Я использую Scala 2.13. Поэтому у меня есть следующие коды:

object helloworld extends App {
  val a: Any = 1
  val x = a match{
    case 2 => 22
    case m: String => "aa"
    case n: Int => 11
  }

  println(s"$x  $m $n")
}

IDE сообщает об ошибке: значения m и n не найдены. Теперь, даже если я заранее определю переменные m и n, они не будут назначены, как сказано в книге :

object helloworld extends App {
  var m: Any = ()
  var n: Any = ()
  val a: Any = 1
  val x = a match {
    case 2 => 22
    case m: String =>
      println(s"m = $m")
      "aa"
    case n: Int =>
      println(s"n = $n")
      11
  }

  //  println(s"$x  $m $n") 
  println(s"x = $x")
  println(s"m = $m n = $n")
}

Есть ли что-то другое в Scala 2.13 или Есть ли что-то, что я сделал не так? Спасибо.

Ответы [ 3 ]

4 голосов
/ 10 января 2020

Эта формулировка неаккуратна:

Если после ключевого слова case следует имя переменной, тогда этому совпадению присваивается выражение соответствия

case выражение не присваивает существующей переменной, оно создает новую переменную, которая доступна только в теле case.

. Оно должно иметь следующий вид:

Если * 1014 За ключевым словом * следует имя переменной, затем создается переменная с таким именем и соответствующему значению присваивается эта переменная. Область действия переменной - это область действия тела case.

4 голосов
/ 10 января 2020

У вас проблема с областью действия. m и n не видны вне случая сопоставления с образцом.

Это работает:

object helloworld extends App {
  val a: Any = 1
  val x = a match{
    case 2 => 22
    case m: String =>
      println(s"m = $m")
      "aa"
    case n: Int =>
      println(s"n = $n")
      11
  }

  println(s"x = $x")
}

Отпечатки:

n = 1
x = 11

Решение для Обновленный Вопрос: :

object helloworld extends App {
  var m: Any = ()
  var n: Any = ()
  val a: Any = 1
  val x = a match {
    case 2 => 22
    case m1: String =>
      m = m1
      "aa"
    case n1: Int =>
      n = n1
      11
  }

  println(s"x = $x")
  println(s"m = $m n = $n")
}

Отпечатки:

x = 11
m = () n = 1

Но это нехорошо Scala стиль!

3 голосов
/ 10 января 2020
val m = ???
val n = ???
val x = a match {
  case 2 => 22           //if a is 2 x=22
  case m: String => "aa" //if a is a String create new variable m, x="aa"
  case n: Int => 11      //if a is an Int create new variable n, x=11
}
//if m or n were created forget them, now out of scope
//only original (unchanged) m and n variables are visible
...