2012-05-17 9 views
26

Okazało się, że interesujące, że this puzzler, w szczególności kod:Co dokładnie poprawiła Scala z dopasowaniem do wzorca w wersji 2.10?

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

zawodzi w czasie pracy w Scala 2.9.1, ale nie w czasie kompilacji w/2,10 M3 (który jest wielki). Próbuję śledzić, co nadchodzi w nowych wydaniach Scali, ale nie mogę połączyć kropek tutaj. Jakie ulepszenie doprowadziło do tego bardziej precyzyjnego zachowania?

+2

Nie mam pojęcia, dlaczego to się nie powiedzie w czasie wykonywania i nie skompilować czasu w żadnej wersji Scala. –

+0

Sądzę, że po prostu prześlizgnął się gdzieś przez test. To naprawdę zabawne: rozmawiałem wczoraj z wielbicielem Pythona o tym, jak świetna jest Scala, ale dziś odkrywam, że Scala zawodzi, gdy przedstawiono jej zadanie, które jest prawie klasycznym z natury Pythonem. – pmcs

+1

'val (i: Int, j: Int) = (" 3 "," 4 ")' zawiedzie podczas kompilacji w 2.9.1 – Rogach

Odpowiedz

10

Rzeczą, która się dzieje jest to, że nowy wzór matcher jest znacznie łatwiejsze do poprawy i utrzymania, ponieważ nie jest to kawałek kodu gniazda szczurów. Poniższy przykład kodu powinien również wykazywać taką samą zmianę:

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

Co się dzieje jest Scala zrozumienia w czasie kompilacji, że wzór nie może być dopasowane.

16

W wersji 2.10, wzornik matcher został całkowicie przeprojektowany i obecnie jest to zwirtualizowany układ dopasowujący wzór . Read more about it!

+1

Cóż, wirtualna część jest po prostu wewnętrzna, chyba że przekażesz flagę, iirc. Rzeczywiste dane wyjściowe nie są wirtualne (tzn. Nie są implementowane jako wywołania monady). –

+1

Cóż, tak. Ale najważniejsze jest to, że reprezentuje kompletny zapis (co wyjaśniałoby, dlaczego jego zachowanie się zmieniło). –

+0

Dlaczego wzorcowy wzór miałby znaczenie w tym przykładzie? Oczekuję, że kompilator odrzuci kod podczas sprawdzania typów, zanim dotrze do szablonu matowania ... –

Powiązane problemy