2011-11-20 8 views
6

Dopo aver letto this answer Ho provato a giocare con questo caratteristica piacevole da me e ha scoperto che è ok quando sto faccioassegnazione multipla tramite pattern matching con array non funziona con vals maiuscole

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 

Ma non va bene con la variabile con nome maiuscolo:

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(",") 

Qual è la ragione di tale comportamento?

UPD In realtà, la stessa cosa con le tuple assigment:

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

risposta

10

Scala lo tratta come una costante contro il quale in base al modello. Osservare:

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: [[email protected] (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) 

Le variabili in cui si desidera estrarre i valori devono iniziare con una lettera minuscola.