Многократное назначение через сопоставление с образцом с массивом не работает с верхним регистром - PullRequest
6 голосов
/ 20 ноября 2011

После прочтения этого ответа Я попытался поиграть с этой замечательной функцией сам и обнаружил, что это нормально, когда я делаю

scala> val Array(a,b,n) = "XXX,YYY,ZZZ".split(",")
a: java.lang.String = XXX
b: java.lang.String = YYY
n: java.lang.String = ZZZ

Но с именованной переменной в верхнем регистре не все в порядке:

scala> val Array(a,b,N) = "XXX,YYY,ZZZ".split(",")
<console>:9: error: not found: value N
       val Array(a,b,N) = "XXX,YYY,ZZZ".split(",")

В чем причина такого поведения?

UPD На самом деле, то же самое с назначением кортежей:

scala> val (a,b,N) = (1,2,3)
<console>:9: error: not found: value N
       val (a,b,N) = (1,2,3)

1 Ответ

13 голосов
/ 20 ноября 2011

Scala рассматривает его как константу, с которой сопоставляется шаблон.Обратите внимание:

scala> val N = 20
N: Int = 20

scala> val Array(a, b, N) = Array(11, 23, 20)
a: Int = 11
b: Int = 23

scala> val Array(a, b, N) = Array(11, 23, 21)
scala.MatchError: [I@195d471 (of class [I)
        at .<init>(<console>:75)
        at .<clinit>(<console>)
        at .<init>(<console>:11)
        at .<clinit>(<console>)
        at $print(<console>)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704)
        at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920)
        at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43)
        at scala.tools.nsc.io.package$$anon$2.run(package.scala:25)
        at java.lang.Thread.run(Thread.java:662)

Переменные, в которые вы хотите извлечь значения , должны начинаться со строчной буквы.

...