Scala val и var связанный вопрос и scala, требующий, чтобы я назначил значение при объявлении - PullRequest
3 голосов
/ 05 июля 2011

У меня есть переменная, которую я хочу объявить как:

val foo : Baz

for (s <- barList) {
 if s.tag == "java"
   foo = s
}

Как только foo назначено значение, foo не может быть переназначено. С этой точки зрения foo имеет тип val, а не var. Но выше недопустим скалярный код, так как скала заставляет присваивать значение во время объявления. Даже если я использую var, scala заставляет меня присваивать значение. Есть ли лучшее решение? Причина, по которой я хотел бы использовать val, заключается в том, что это приводит к лучшей производительности и семантике val, которая соответствует приведенному выше сценарию.

Ответы [ 4 ]

16 голосов
/ 05 июля 2011

Я бы сделал что-то вроде этого:

val foo: Baz = barList.find(_.tag == "java").getOrElse( /* provide default here */)
7 голосов
/ 05 июля 2011

Проблема в том, что вы смотрите на это с точки зрения C - переменная, изменяемая или нет, является просто адресом памяти, в который нужно поместить какое-то значение.

Однако в функциональных языках переменнаяпохожее на именованное выражение (более или менее).Вы заявляете: с этого момента, вещь слева должна рассматриваться как вещь справа.Простое объявление переменной - это попытка присвоить имя пустоте.

Если вы, однако, не заботитесь о таких вещах, вы можете использовать var, чтобы сохранить значение, обновить его или все, что вам нужно, ипереназначить его на val.Или просто измените и используйте решение MageeS.

5 голосов
/ 05 июля 2011

А как же

val foo = barList.find(_.tag == "java")
1 голос
/ 05 июля 2011

Вы можете использовать _, чтобы передать значение по умолчанию var (для val это совершенно бесполезно):

var foo : Baz = _

for (s <- barList) {
  if s.tag == "java"
   foo = s
}

Однако для этого конкретного примера решение MageeSлучше.Если возможно, избегайте объявления var.

Редактировать: В ответ на комментарий Жан-Филиппа.Если внутри тела функции, если вы не можете назначить разумное значение по умолчанию.Вы должны использовать Option.Код становится следующим:

var foo : Option[Baz] = None

for (s <- barList) {
  if s.tag == "java"
   foo = Some( s )
}

После цикла foo будет по-прежнему равен None, если ничего не найдено, или равно Some(...), где точки заменяют последний элемент в barList.чей тег "Java".Вы можете получить это значение с помощью foo.get.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...