2013-05-18 1 views
6

Ho visto questo tipo di codice innumerevoli siti web ancora non sembra per compilare:Scala non trovato: il valore x All'apertura della confezione, tornato tuple

def foo(): (Int, Int) = { 
     (1, 2) 
} 

def main(args: Array[String]): Unit = { 
     val (I, O) = foo() 
} 

Non riesce sulla linea marcata, riportando:

  • non trovato: valore che
  • non trovato: il valore O

Quale potrebbe essere la causa di questo?

+7

È perché sono lettere maiuscole. Controlla http://stackoverflow.com/questions/2727612/scalas-tuple-unwrapping-nuance. 'val (i, o) = foo' funzionerà. – Chirlo

risposta

8

Il problema è l'uso di lettere maiuscole I e O nella corrispondenza del modello. Dovresti provare a sostituirlo con lettere minuscole val (i, o) = foo(). Lo Scala Language Specification afferma che una definizione di valore può essere espansa in una corrispondenza di modello. Ad esempio la definizione val x :: xs = mylist espande al seguente (vedi p. 39):

val x$ = mylist match { case x :: xs => {x, xs} } 
val x = x$._1 
val xs = x$._2 

Nel suo caso, la definizione valore val (i, o) = foo() viene espansa in modo simile. Tuttavia, la specifica del linguaggio afferma anche che un pattern match contiene lettere minuscole (cfr p 114.):

Un modello x variabile è un semplice er fi identi che inizia con una lettera minuscola .

3

Come da Scala naming convention,

metodo, valore e nomi delle variabili devono essere in camelCase con il primo lettera minuscola:

tuo I, O sono le variabili del modello. Tuttavia, devi essere cauto quando li definisci. Per convenzione, Scala si aspetta che le variabili del modello inizino con una lettera minuscola e si aspetta che le costanti inizino con una lettera maiuscola. Quindi, il codice non verrà compilato.