2016-03-30 1 views
0

Может быть, я что-то отсутствует очевидный, но это просто приложение не работает:Добавление записей карты проваливается в программе, но работает в переводчика

object runnable extends App { 
    Test.calculate 
} 
object Test { 
    val c = Map[Int, Int]() 
    def calculate { 
    c + (1 -> 2) 
    } 
... 

И установить точку останова в отладчике сразу после этой линии, содержание карты является Map()

но если я эквивалент в РЕПЛ:

val c = Map[Int,Int]() 
c: scala.collection.immutable.Map[Int,Int] = Map() 
c+(1->2) 
res2: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2) 

Я даже попытался сделать карту изменяемой в коде приложения, но я t не работает.

Я что-то упустил?

Спасибо.

+0

Добавить '=' для расчета 'def calculate =' –

+0

Я действительно хотел продемонстрировать, что добавление записей на карту не работает, используя функцию Unit. Я хочу понять, возможно ли создать поле экземпляра в качестве побочного эффекта вызова функции. Эта тестовая функция не является фактическим кодом, но она эмулирует поведение, которое я пытаюсь понять. –

ответ

1

Вы пропускаете назначение на новый varibale после добавления к карте:

val c1 = Map[Int, Int]() 
val c2 = c1 + (1 -> 2) 
println(c2) // Map(1 -> 2) 

// using a var instead 
var c = Map[Int, Int]() 
c = c + (1 -> 2) 
println(c) // Map(1 -> 2) 

Вы не можете изменить экземпляр scala.collection.Map как это неизменны. Если вы хотите карту изменяемых вам нужно использовать scala.collection.mutable.Map:

val c = scala.collection.mutable.Map[Int, Int]() 
// the next three lines are differnt ways to add an element 
c.put(1, 2) 
c(1) = 2 
c += 1 -> 2 
println(c) // Map(1 -> 2) 
+0

Я думал, что, используя класс val, он будет содержать состояние, как это было бы на Java. Разве это не так? Он также не работает, если я использую var в области класса. Я надеялся, что эта карта построена в экземпляре класса и захватит ее из runnable объекта. По существу следуя той же схеме, которую вы бы использовали в Java. –

+0

OK, вам может понадобиться измененная карта (я добавил образец ответа). Но имейте в виду, что использование неизменных коллекций является предпочтительным, потому что это упрощает ваш код. – Sebastian

0

Я следовал за документы, http://docs.scala-lang.org/overviews/collections/maps.html, что подразумеваемые изменяемая карта может быть элементы добавлены без введения новой ссылки.

@Sebastian правильный, он должен быть var. Рабочая версия выглядит следующим образом:

object runnable extends App { 
    Test.calculate 
} 
object Test { 
    var c = Map[Int, Int]() 
    def calculate { 
    c += (1 -> 2) 
    } 
... 
0

Подумайте код работал переводчиком, потому что сразу выводит результат (в данном случае результат функции +).

Вот почему вы получаете 2 отличных reponses (c, res2).

Вы должны попытаться вычислить тип функции.

это не так: Пустота -> Пустота

это: Пустота -> Карта [Int, Int]

Я надеюсь, что это может помочь вам

Смежные вопросы