2016-05-04 11 views
9

riscontrano difficoltà capire questa sintassi,Assegnazione di blocco di codice in Val

val grid = { 
    val input = """ 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 
       |49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 
       |81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 
       |52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 
       |22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 
       |24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 
       |32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 
       |67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 
       |24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 
       |21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 
       |78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 
       |16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 
       |86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 
       |19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 
       |04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 
       |88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 
       |04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 
       |20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 
       |20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 
       |01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 """ 
       .stripMargin 
    val rows = input.split("\n").map(_.trim) 
    rows.map(_.split(" ").map(_.toInt)) 
} 

Qui grid è di tipo Array[Array[Int]]> comprendo che stiamo creando una matrice 2D basato su una logica interna {} di grid. Ma che cos'è questo val grid = {} e come possiamo fare i calcoli al suo interno.

+0

Suggerirei di cambiare il titolo in qualcosa di simile: 'Scala - assegnazione del blocco di codice in val' o qualcosa del genere, poiché questa è una (buona!) Domanda riguardante questa sintassi e non è affatto specifica per gli array multidimensionale o no –

risposta

5

In Scala, tutto è un'espressione e puoi combinare qualsiasi sequenza di espressioni praticamente in qualsiasi posizione del programma.

Così qui, assegniamo qualcosa a grid, che qualcosa è il contenuto dell'espressione di blocco {}. Puoi avere sequenze arbitrarie di espressioni in un'espressione di blocco, quindi nel tuo esempio iniziamo definendo due val, principalmente per rendere il codice più facile da leggere.

Quindi l'ultima espressione, che esegue un sul valore definito rows è l'espressione restituita dal blocco. Questo è il valore che verrà assegnato a grid.

Un buon motivo per fare una cosa del genere qui è che sia input sia rows sono visibili solo nel blocco in cui sono definiti. Ciò significa che non inquinano l'ambito in cui si utilizza grid. In realtà è molto bello.

2

Come dichiarazioni di metodo (def) è possibile avere un Block Expression definito, così fa un Value Declaration.

Se guardiamo la specifica (6.11) in "Block", possiamo vedere la definizione per una dichiarazione di blocco valida:

Un'espressione blocco { s1; ……; sn; e} è costruito da una sequenza di dichiarazioni di blocco s1,…,sn e una espressione finale e. La sequenza di istruzioni non può contenere due definizioni o dichiarazioni che associano lo stesso nome nello stesso spazio dei nomi. L'espressione finale può essere omessa, nel qual caso si assume il valore unitario ().

Il tipo previsto di espressione finale e è il tipo previsto di del blocco. Il tipo previsto di tutte le dichiarazioni precedenti non è definito.

e poi va per specificare la definizione per una dichiarazione di blocco di valori:

  • Una definizione valore definito a livello locale val x: T = e è vincolata dalla clausola di esistenziale val x: T

Valutazione del il blocco comporta la valutazione della sua sequenza di istruzioni , seguita da un valutazione dell'espressione finale e, che definisce il risultato del blocco.

Questo mostra che l'espressione di blocco è valida per la dichiarazione membro e per i metodi. Ciò è particolarmente utile quando si dispone di un blocco di codice che è rilevante solo per l'inizializzazione del membro, consentendo di creare una sequenza di inizializzazione più complessa.

Problemi correlati