2011-11-20 49 views
6

工作读书this answer我试图通过自己对这个不错的功能发挥后,发现这是确定当我做多分配与大写瓦尔斯

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 事实上,与元组分配新建分配FY同样的事情:

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

回答

10

斯卡拉将其视为一个常量针对其匹配的模式。注意:

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) 

的变量中,你要提取值必须用小写字母开头。