6 votes

L'affectation multiple via la correspondance de motifs avec Array ne fonctionne pas avec les vals en majuscules.

Après avoir lu cette réponse J'ai essayé de jouer avec cette fonctionnalité par moi-même et j'ai découvert que c'est ok quand je fais

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

Mais il n'y a pas de problème avec les noms de variables en majuscules :

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

Quelle est la raison d'un tel comportement ?

UPD En fait, c'est la même chose avec la répartition des tuples :

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

13voto

missingfaktor Points 44003

Scala le traite comme une constante contre laquelle faire correspondre le motif. Observez :

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)

Les variables dans lesquelles vous voulez extraire les valeurs doit commencent par une lettre minuscule.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X