Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala变量模式:未分配变量_Scala_Variables_Pattern Matching - Fatal编程技术网

Scala变量模式:未分配变量

Scala变量模式:未分配变量,scala,variables,pattern-matching,Scala,Variables,Pattern Matching,在《不耐烦的第二版》的Scala中,作者说: 如果case关键字后跟变量名,则匹配 表达式被指定给该变量 同样,在中也给出了类似的陈述 我使用的是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 } print

在《不耐烦的第二版》的Scala中,作者说:

如果case关键字后跟变量名,则匹配 表达式被指定给该变量

同样,在中也给出了类似的陈述

我使用的是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变量,它们也不会像书中所说的那样赋值:

Scala 2.13有什么不同的地方吗,或者我做错了什么? 谢谢。

您的范围有问题。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
x = 11
m = () n = 1
更新问题的解决方案::

印刷品:

n = 1
x = 11
x = 11
m = () n = 1
但这不是好的Scala风格

您有一个范围问题。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
x = 11
m = () n = 1
更新问题的解决方案::

印刷品:

n = 1
x = 11
x = 11
m = () n = 1

但这不是好的Scala风格

这句话太草率了:

如果case关键字后面跟一个变量名,则会将匹配表达式指定给该变量

案例表达式不会指定给现有变量,而是创建一个仅在案例主体中可用的新变量

应改为:

如果case关键字后跟一个变量名,则会创建一个具有该名称的变量,并将匹配值分配给该变量。变量的范围是案例主体的范围


这句话很草率:

如果case关键字后面跟一个变量名,则会将匹配表达式指定给该变量

案例表达式不会指定给现有变量,而是创建一个仅在案例主体中可用的新变量

应改为:

如果case关键字后跟一个变量名,则会创建一个具有该名称的变量,并将匹配值分配给该变量。变量的范围是案例主体的范围


查看我的更新答案。查看我的更新答案。