2017-03-14 33 views
7

Obudowa A/A, nie case.Kiedy sprawa ma znaczenie syntaktyczne?

Widocznie case a pasuje wszystko, a to wiąże się z nazwą a, natomiast case A szuka zmiennej A i pasuje nic == uważa równa A. Było to dla mnie zaskoczeniem; podczas gdy wiem, że Scala rozróżnia małe i wielkie litery, nigdy nie oczekiwałem, że przypadek identyfikatora wpłynie na reguły parsowania.

Czy często w składni Scala zależy na przypadku identyfikatorów, czy też jest tylko niewielka liczba kontekstów, w których to się dzieje? Jeśli jest tylko niewielka liczba takich kontekstów, jakie one są? Nie mogłem znaleźć niczego w Google; wszystko, co dostałem, to wyniki dotyczące dopasowywania wzorców.

+1

Właściwie wierzę, że to jedyny, ale zostawię odpowiedź komuś, kto zna specyfikację lepiej ode mnie. –

+0

Myślę, że szukasz [* stabilnych wzorów identyfikatorów *] (http://www.scala-lang.org/files/archive/spec/2.12/08-pattern-matching.html#stable-identifier-patterns) – Bergi

+1

@Bergi: Właściwie już to powiązałem z pytaniem, chociaż ze śmiercią podkreślenia linku, może to być trudne do zauważenia. – user2357112

Odpowiedz

4

Jest jeszcze jeden podobny, o nazwie: type pattern. W przypadku wzorca typu prosty identyfikator rozpoczynający się od małej litery jest zmienną typu , a wszystkie pozostałe próbują dopasować rzeczywiste typy (z wyjątkiem _).

Na przykład:

val a: Any = List(1, 2, 3) 
val c = 1 

// z is a type variable 
a match { case b: List[z] => a } 

// Type match on `Int` 
a match { case b: List[Int] => a } 

// type match on the singleton c.type (not a simple lower case identifier) 
// (doesn't actually compile because c.type will never conform) 
a match { case b: List[c.type] => a } 

Rodzaj dopasowywania jak w pierwszym przykładzie jest mniej znany, ponieważ dobrze, to prawie nie używany.

+0

[tutaj] (http://stackoverflow.com/a/7318089/2292812) jest dobrym przykładem zmiennych typu w działaniu. –

+0

Naprawdę miałem nadzieję, że nie będzie więcej przykładów, ale przynajmniej te dwa przykłady są spójne. Czy wiesz, czy są to jedyne przykłady, jak 2.12? (Nie akceptuję, ponieważ nie chcę zniechęcać do dalszych odpowiedzi lub przypinać tego do szczytu, zwłaszcza jeśli zmiana języka i większe znaczenie ma znaczenie). – user2357112

+0

@ user2357112 Mogę powiedzieć tylko z 99,99% pewnością, ponieważ kto wie, czy ich jakiś dziwny błąd, z którym nikt nigdy się nie spotkał, ale te dwa podobne przypadki są jedynymi wymienionymi w specyfikacji. Byłbym zainteresowany, gdyby ktoś wymyślił coś innego. –