Co dokładnie oznacza „val a: A = _” (podkreślenie) w Scali?

120

Do czego dokładnie val a: A = _inicjalizuje wartość? Czy to wpisana wartość null? Dzięki.

Gregor Scheidt
źródło
2
Zupa symbol Scali .
Shelby Moore III

Odpowiedzi:

143

val a: A = _to błąd kompilacji. Na przykład:

scala> val a: String = _
<console>:1: error: unbound placeholder parameter
       val a: String = _
                       ^

Co działa to var a: A = _(uwaga varzamiast val). Jak mówi Chuck w swojej odpowiedzi, inicjalizuje to zmienną do wartości domyślnej. Ze specyfikacji języka Scala:

0, jeśli T jest Int lub jednym z jego typów podzakresów,
0L jeśli T jest Long,
0,0f jeśli T jest Float,
0,0d jeśli T jest Double,
false, jeśli T jest Boolean,
() jeśli T jest Unit,
null dla wszystkich innych typów T.

Paul Butcher
źródło
6
Ha, niezły zaczep na przełączniku val / var. Mój mózg właśnie przemknął obok niego.
Chuck
2
Jakieś wyjaśnienie, dlaczego nie zostało to stworzone do pracy val?
Erik Kaplun
4
@ErikAllik: To są czyste spekulacje, ale val a: Int = _prawdopodobnie jest to błąd kompilacji, ponieważ byłoby to zła praktyka, gdyby zadziałało. Byłby to po prostu zaciemniony sposób pisania val a: Int = 0. Ustawienie varwartości domyślnej ma sens, ponieważ varoczekuje się, że a ulegnie zmianie, ale wartość a valjest ustalona, ​​więc najlepszą praktyką byłoby jawne przypisanie wartości.
Shuklaswag
1
@Shuklaswag: Tylko jeśli znasz liczbę całkowitą. Próbuję użyć tego do zainicjowania wartości typu, którego jeszcze nie znam.
Adrian May
33

Inicjuje asię do domyślnej wartości typu A. Na przykład domyślną wartością Int to 0, a domyślną wartością typu odwołania jest null.

Głaskanie pod brodę
źródło
10
Jaka jest domyślna wartość klasy, która miesza NotNullcechę? :-)
Jean-Philippe Pellet
9
@ Jean-PhilippePellet: Począwszy od Scala 2.9.0.1 (która jest najnowszą wersją, z której korzystałem), domyślną wartością klasy, która miesza cechę NotNull jest - dramatyczna pauza - null . Spodziewam się, że w pewnym momencie to się zmieni, ale obecnie wydaje się, że to _atuty NotNull.
Chuck