`val(A)=(3)`是正确的,但`val(A,B)=(2,3)`无法编译,为什么?

Fre*_*ind 7 scala pattern-matching

val A = 3
val (A) = (3)
Run Code Online (Sandbox Code Playgroud)

两个都正确.但:

val (A,B) = (2,3)
Run Code Online (Sandbox Code Playgroud)

无法编译:

scala> val (A,B) = (2,3)
<console>:7: error: not found: value A
       val (A,B) = (2,3)
            ^
<console>:7: error: not found: value B
       val (A,B) = (2,3)
              ^
Run Code Online (Sandbox Code Playgroud)

为什么?

Bri*_*Hsu 13

在第二个代码片段中,它使用模式匹配来进行评估.

它被翻译成以下代码:

val Tuple(A, B) = Tuple2(2,3)
Run Code Online (Sandbox Code Playgroud)

当Scala进行模式匹配时,变量以模式中的大写开头被视为常量值(或单例对象),因此val (a, b) = (2, 3)可以工作但不能val (A, B) = (2, 3).

顺便说一句,你的第一个代码片段没有使用模式匹配,它只是一个普通的变量赋值.

如果Tuple1明确使用,则会出现相同的错误.

scala> val Tuple1(Z) = Tuple1(3)
<console>:7: error: not found: value Z
       val Tuple1(Z) = Tuple1(3)
Run Code Online (Sandbox Code Playgroud)

这是一些有趣的例子:

scala> val A = 10
A: Int = 10

scala> val B = 20
B: Int = 20

scala> val (A, x) = (10, 20)
x: Int = 20

scala> val (A, x) = (10, 30)
x: Int = 30

scala> val (A, x) = (20, 20)
scala.MatchError: (20,20) (of class scala.Tuple2$mcII$sp)
    at .<init>(<console>:9)
    at .<clinit>(<console>)
Run Code Online (Sandbox Code Playgroud)