2011-12-25 9 views
6

¿Por qué esta falla al compilar:método y Scala valora nombres

scala> val a? = true 
<console>:1: error: illegal start of simple pattern 
    val a? = true 
     ^

y esto funciona?

scala> val a_? = true 
a_?: Boolean = true 
+3

Ver http://stackoverflow.com/a/7657692/257449 – huynhjl

Respuesta

6

De acuerdo con la especificación del lenguaje Scala (mirando a 2,8, dudar de las cosas han cambiado mucho desde entonces):

idrest :: = {carta | digit} [`_ 'op]

Es decir, un identificador puede comenzar con una letra o un dígito seguido de un guion bajo y otros caracteres del operador. Eso hace identificadores como [email protected]! identificadores válidos. Además, tenga en cuenta que los identificadores también pueden contener una cadena de caracteres de operador solos. Considere la siguiente sesión REPL:

Welcome to Scala version 2.9.1.final (Java HotSpot(TM) Client VM, Java 1.6.0_16). 

scala> val +aff = true 
<console>:1: error: illegal start of simple pattern 
val +aff = true 
^ 

scala> val ??? = true 
???: Boolean = true 

scala> val [email protected]! = true 
[email protected]!: Boolean = true 

scala> val %^@%@ = true 
%^@%@: Boolean = true 

scala> val ^&*!%@ = 42 
^&*!%@: Int = 42 

Espero que responda a su pregunta.

2

La gramática de Scala para los identificadores se define de tal manera. ? se define como un carácter de operador. Y un identificador debe obedecer las siguientes reglas: debe ser una letra minúscula que puede ser seguida por un elemento de una categoría sintáctica 'idrest', que se define como 'letras o dígitos, posiblemente seguido de _ y un opchar . ' Ver Scala Language Specification para más detalles.