2011-12-25 14 views
6

Dlaczego nie skompilować:metoda Scala i wartości nazwy

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

i to działa?

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

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

Odpowiedz

6

Według specyfikacji języka Scala (patrząc na 2,8, ponieważ wątpię rzeczy zmieniły się znacznie):

idrest :: = {list | cyfra} [`_ 'op]

Oznacza to, że identyfikator może rozpoczynać się od litery lub cyfry, po której następuje znak podkreślenia i dalsze znaki operatora. Czyni to identyfikatory, takie jak ważne identyfikatory [email protected]!. Należy również pamiętać, że identyfikatory mogą również zawierać ciąg samych znaków operatora. Rozważmy następującą sesję 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 

Mam nadzieję, że to odpowiada na twoje pytanie.

2

Gramatyka Scala dla identyfikatorów jest zdefiniowana w taki sposób. ? jest zdefiniowany jako znak operatora. Identyfikator musi być zgodny z następującymi regułami: musi to być mała litera, po której może następować element kategorii składniowej "idrest", który jest zdefiniowany jako "litery lub cyfry, po których ewentualnie następuje _ i znak op . " Aby uzyskać więcej informacji, patrz Scala Language Specification.