2012-05-17 6 views
26

ho trovato interessante il fatto che this puzzler, nello specifico di questo codice:Che cosa ha migliorato Scala con l'abbinamento di modelli in 2.10?

val (i, j): (Int, Int) = ("3", "4") 

Fails in fase di esecuzione in Scala 2.9.1, ma fallisce al momento della compilazione w/2.10 M3 (che è grande). Cerco di tenere traccia di ciò che arriverà nelle nuove versioni di Scala, ma non riesco a collegare i punti qui. Quale miglioramento ha portato a questo comportamento più preciso?

+2

Non ho idea del perché questo non funzionerebbe in fase di runtime e non compile il tempo in nessuna versione di Scala. –

+0

Immagino che sia appena passato attraverso un test da qualche parte. In realtà è piuttosto divertente: stavo parlando con un devoto Python ieri riguardo a quanto è grande Scala, solo per scoprire oggi che Scala fallisce quando viene presentato con un compito che è quasi classico in natura. – pmcs

+1

'val (i: Int, j: Int) = (" 3 "," 4 ")' fallisce in fase di compilazione in 2.9.1 – Rogach

risposta

10

La cosa che sta succedendo è che il nuovo pattern matcher è molto più facile da migliorare e mantenere, perché non è un pezzo di codice del nido dei ratti. Il seguente codice di esempio dovrebbe anche esporre la stessa modifica:

("3", "4") match { case (i, j): (Int, Int) => /* whatever */ } 

Quello che sta succedendo è Scala comprensione al momento della compilazione che il modello non può mai essere abbinato.

16

In scala 2.10, il pattern matcher ha avuto una riscrittura completa ed è ora il modello matcher virtualizzato. Read more about it!

+1

Bene, la parte virtuale è solo interna a meno che non si superi una bandiera, iirc. L'output effettivo non è virtuale (cioè, non è implementato come chiamate su una monade). –

+1

Beh, sì. Ma il punto principale è che rappresenta una completa riscrittura (che spiegherebbe perché il suo comportamento potrebbe essere cambiato) –

+0

Perché il pattern matcher dovrebbe fare la differenza in questo esempio? Mi aspetterei che il compilatore rifiutasse il codice durante il controllo dei tipi prima che arrivasse al modello matcher ... –