通过模式匹配与 Array 进行多重分配不适用于大写 vals [英] Multiple assignment via pattern matching with Array is not working with uppercase vals

查看:38
本文介绍了通过模式匹配与 Array 进行多重分配不适用于大写 vals的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

阅读这个答案后我已经尝试自己玩这个不错的功能,发现我玩的时候没问题

After reading this answer I've tried to play with this nice feature by myself and found out that it is ok when I'm do

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

但是不能用大写的命名变量:

But is not ok with uppercase named variable:

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

这种行为的原因是什么?

What is the reason of such behavior?

UPD实际上,元组分配也是一样:

UPD Actually, the same thing with tuples assigment:

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

推荐答案

Scala 将其视为与模式匹配的常量.观察:

Scala treats it as a constant against which to match the pattern. Observe:

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)

要在其中提取值的变量必须以小写字母开头.

The variables in which you want to extract the values must begin with a lower-case letter.

这篇关于通过模式匹配与 Array 进行多重分配不适用于大写 vals的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆