2011-11-20 6 views
6

Po przeczytaniu this answer Próbowałem grać z tym miłym funkcji przez siebie i okazało się, że jest ok, gdy mam zrobićwielokrotne przypisanie poprzez wzór pasujący z tablicy nie pracuje z wielkich odstępach

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 

Ale nie jest dobrze z dużą zmienną o nazwie:

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

Jaki jest powód takiego zachowania?

UPD Właściwie, to samo z krotek assigment:

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

Odpowiedz

10

Scala traktuje ją jako stałą, przeciwko któremu dopasować wzór. Przestrzegać:

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) 

Zmienne, w którym chcesz, aby wyodrębnić wartości musi zaczynają się z małej litery.