Как карта или список могут быть неизменными, когда мы можем добавлять или удалять элементы из них? - PullRequest
1 голос
/ 08 июля 2019

Ниже приведен код scala для объявления неизменной карты

var m:Map[Int,String] = Map(1->"hi",2->"hello")
println(m)
// Result: Map(1->"hi",2->"hello")

Здесь мы можем добавлять или изменять содержимое карты, тогда как мы можем сказать, что карта или список в Scala неизменны

m=m+(3->"hey") 
println(m)
// Result: Map(1->"hi",2->"hello",3->"hey")**

Ответы [ 2 ]

8 голосов
/ 08 июля 2019

Map является неизменным, но вы использовали mutable переменную m (потому что вы объявили ее как var).

Эта строка m=m+(3->"hey") фактически создает новую карту и присваивает еек вашей переменной m.

Попробуйте объявить m как val и увидите, что вы получите ошибку компиляции.

Но - если вы будете использовать изменяемую карту:

val m = scala.collection.mutable.Map[Int,String]

Вы сможете обновить эту карту (пока вы не можете сделать это с неизменной картой) -

m(3) = "hey"

или

m.put(3,"hey")

Вот какВы обновите содержимое карты, не воссоздавая ее и не изменив переменную m (как вы это делали ранее с m = m + ...), потому что здесь m объявлен как val, что делает его неизменным, но картаизменяемый.

Вы все еще не можете сделать m = m + .., когда он объявлен как val.

Пожалуйста, обратитесь к этому ответу о различиях между varи val.

2 голосов
/ 08 июля 2019

Даже если вы думаете, что ваш вопрос не о var или val, на самом деле это так: в вашем примере очень важно, чтобы m было определено как var или val.В вашем примере, даже если вы видите, что карта изменилась, на самом деле это не так: ваш код создает другую карту и присваивает ее той же переменной.Сама карта не изменилась, потому что она неизменна.Вы можете наблюдать это в этом коде:

val m1 = Map(1 -> "hi", 2 -> "hello")

var m = m1
m = m + (3 -> "hey")

println(m)   // prints Map(1 -> ..., 2 -> ..., 3 -> ...)
println(m1)  // prints Map(1 -> ..., 2 -> ...)

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

...