Что в Scala означает «val a: A = _» (подчеркивание)?


Ответы:


143

val a: A = _это ошибка компиляции. Например:

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

Что работает var a: A = _(обратите внимание varвместо val). Как говорит Чак в своем ответе, это инициализирует переменную значением по умолчанию. Из спецификации языка Scala:

0, если T - Int или один из его типов поддиапазона,
0L, если T - Long,
0.0f, если T - Float,
0.0d, если T - Double,
false, если T - Boolean,
(), если T - Unit,
null для всех других типов Т.


6
Ха, хороший улов на переключателе val / var. Мой мозг просто промчался мимо этого.
Чак

2
Любое понимание того, почему это не было сделано для работы val?
Эрик Каплун

4
@ErikAllik: Это чистое предположение, но val a: Int = _, вероятно, это ошибка компиляции, потому что это было бы плохой практикой, если бы это сработало. Это был бы просто запутанный способ написания val a: Int = 0. Установка значения varпо умолчанию имеет смысл, поскольку varожидается, что он изменится, но valфиксирован, поэтому лучше всего назначать значение явно.
Shuklaswag 09

1
@Shuklaswag: Только если вы знаете, что это целое число. Я пытаюсь использовать это для инициализации val типа, которого я еще не знаю.
Адриан может

33

Он инициализируется aзначением типа по умолчанию A. Например, значение по умолчанию для Int равно 0, а значение по умолчанию для ссылочного типа - null.


10
Какое значение по умолчанию для класса, который смешивается с этим NotNullпризнаком? :-)
Жан-Филипп Пелле

9
@ Jean-PhilippePellet: Начиная с Scala 2.9.0.1 (это самая последняя версия, которую я использовал), значение по умолчанию для класса, который смешивается с чертой NotNull, - драматическая пауза - null . Я ожидаю, что в какой-то момент это, вероятно, изменится, но в настоящее время это кажется _козырем NotNull.
Чак
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.