具有神秘变量的Scala教程

时间:2018-08-02 14:44:32

标签: scala variables match

我是Scala的新手,正在阅读有关提取器(appy / unapply)的教程,并遇到了这个简单的示例。有人可以向我解释为什么在变量“ num”似乎没有定义的情况下为什么会编译并运行吗?它似乎仅在“ match”语句内有效。

object Demo {
   def main(args: Array[String]) {
      val x = Demo(5)
      println(x)

      x match {
         case Demo(num) => println(x+" is bigger two times than "+num)

         //unapply is invoked
         case _ => println("i cannot calculate")
      }
   }
   def apply(x: Int) = x*2
   def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}

输出:

Compiling object source code....
$scalac Demo.scala 2>&1

Executing the program....
$scala -classpath . Demo 
10
10 is bigger two times than 5

1 个答案:

答案 0 :(得分:2)

变量num由模式case Demo(num) => ... 绑定

其作用域从case Demo(num)部分开始,因此您可以在保护表达式中使用它:

case Demo(num) if num % 42 == 0 => ...

,它以下一个casematch块的结尾结束。

来自spec(重点是我):

  

模式匹配测试是否给定值(或值序列)   具有由图案定义的形状,如果有,则绑定   模式中的变量为值的相应组成部分   (或值序列)。相同的变量名称可能没有更多的绑定   不止一次。

(x: Int) => x * x相同-变量x受lambda约束,并且只能在lambda主体中使用。唯一的区别是=>表达式前的左侧可能在match-case表达式中具有更有趣的“形状”。