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


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.