2010-04-26 6 views
2

cela fonctionne comme prévu

 
scala> 3 match { case x:Int => 2*x } 
res1: Int = 6 

pourquoi cette échec?

 
scala> 3 match { case $x:Int => 2*$x } 
:1: error: '=>' expected but ':' found. 
     3 match { case $x:Int => 2*$x } 
         ^

scala> 3 match { case `$x`:Int => 2*$x } 
:1: error: '=>' expected but ':' found. 
     3 match { case `$x`:Int => 2*$x } 
         ^

scala> 3 match { case `$x` : Int => 2*$x } 
:1: error: '=>' expected but ':' found. 
     3 match { case `$x` : Int => 2*$x } 

'$' est censé être un caractère identifiant valide, comme l'a démontré ici:

 
scala> var y = 1 
y: Int = 1 

scala> var $y = 2 
$y: Int = 2 

Merci

+0

... pourquoi voudriez-vous? –

+0

J'écris un langage spécifique au domaine pour compiler des scripts PHP en utilisant Scala. –

+0

Je pense que c'est parce que $ est une réserve pour le compilateur. – Eastsun

Répondre

4

En fait, alors que toutes les autres réponses sont correctes dans un certain sens, l'explication ici est plus simple. Un signe dollar est considéré comme une majuscule selon la spécification et est donc traité comme une constante dans une correspondance de motif.

4

Bien que légale dans les identificateurs, $ est réservé pour une utilisation par le compilateur. Vous verrez beaucoup d'utilisation de $ si vous appelez le code Scala de Java, par exemple. Et, juste pour le rendre 100% clair, "réservé" signifie que vous ne pouvez pas déclarer les identifiants avec lui et attendez que votre code fonctionne.

+0

est ce bug ou réellement dans la spécification Scala quelque part? –

+0

@Alex il est spécifié. –

15

De « La Scala spécification du langage, » Chapitre 1 (« lexicales Syntaxe »).

« Le caractère « $ » est réservé pour les identifiants de synthèse du compilateur-programmes utilisateur ne doivent pas définir des identifiants contenant « $ ' personnages."

Donc ce non -bug est une partie formelle de la spécification du langage.

+1

Merci. Le compilateur Scala devrait au moins émettre un avertissement! –

7

Même s'il est déconseillé, les $ peuvent être écrits dans des identifiants. Mais un identifiant commençant par $ ne compte pas comme identifiant de variable - seuls les identifiants commençant par des lettres minuscules le sont. D'un autre côté, un identifiant typé: Type nécessite un identifiant de variable devant le:. C'est pourquoi le match est rejeté.

+0

Merci, cela explique pourquoi le match/case est l'un des deux seuls endroits où j'ai vu des problèmes avec le '$'. Un autre était en essayant de créer et de passer des fonctions anonymes autour (je suppose que compile à un match de correspondance interne?). –

Questions connexes