2017-06-10 12 views
1

以下の実施例なぜval x = mutable.Map(...)がスカラーで可変ですか?

ケース1考慮:Xはval型であるので、私はケース1を理解することができ

scala> val name = new scala.collection.mutable.HashMap[String, Int] 
name: scala.collection.mutable.HashMap[String,Int] = Map() 

scala>name("Hello") = 1 
scala>name 
res1: scala.collection.mutable.HashMap[String,Int] = Map(Hello -> 1) 

>scala val x = 1 
x:Int = 1 
>scala x = 2 
<console>:11: error: reassignment to val 
    x=2 
    ^

がケース2。ケース2の場合、namevalタイプですが、nameは変更可能です。それを説明する方法?

+1

var name = new scala.collection.mutable.HashMap[String, Int] 

することができますreference/pointとしてvarでそれを定義した場合あなたが**再割り当てしている最初のケース** 'x'。後者の場合、**あなたは**名前を変更しています。 'name'は同じ' Map'を参照しています。 'name = ...'と書いてみてください。 –

+0

変更可能なマップが変更可能である理由を尋ねていますか? –

+0

@JörgWMittagいいえ、 'mutable map'が' mutable'であることは理解できますが、なぜそれが 'val-type'変数に代入できるのかわかりません。 'Answers'は' name'は '可変HashMap'への'ポインタ 'であり、***参照/別のオブジェクトへの***の再割り当てはできません。 – xyz

答えて

3

mutable.HashMapは、あなたがvalまたはvarを使用しても性質上可変です。

valは再割り当てが許可されていませんが、varはインスタンスの参照を変更または再割り当てする場合には、valが変更になります。

例えば、あなたは不変のマップ(データなし変異を)したい場合は、scala.collection.Mapを使用

scala> mutableMap = new scala.collection.mutable.HashMap[String, Int] 
<console>:12: error: reassignment to val 
     mutableMap = new scala.collection.mutable.HashMap[String, Int] 
       ^

データを変異

は、

scala> val mutableMap = new scala.collection.mutable.HashMap[String, Int] 
mutableMap: scala.collection.mutable.HashMap[String,Int] = Map() 

scala> mutableMap += ("some name" -> 8888) 
res3: mutableMap.type = Map(some name -> 8888) 

許可されているが、変異の参照があるためvalで許可されていない、

scala> val immutableMap = scala.collection.Map("prayagupd" -> 1000) 
immutableMap: scala.collection.Map[String,Int] = Map(prayagupd -> 1000) 
1

スカーラ>ヴァル名=新しいscala.collection.mutable.HashMapここで[文字列、INT]

referenceMapコレクションではなく、可変である、あなたは追加/削除することができますそのマップの要素の型がmutable.HashMapの場合、不変のバージョンが必要な場合は、デフォルトのScala Mapを試してください。詳細は

Qutoting:http://docs.scala-lang.org/overviews/collections/overview.html

Scalaのコレクションは、体系的に可変と不変コレクションを区別。変更可能なコレクションを更新または拡張することができます。つまり、副作用としてコレクションの要素を変更、追加、または削除することができます。これに対して不変なコレクションは決して変更されません。追加、削除、または更新をシミュレートする操作はまだありますが、その操作ではそれぞれ新しいコレクションが返され、古いコレクションは変更されません。

1

例では、val名は可変インスタンスへの不変の参照です。ハッシュマップは、あなたが明示的に要求した変更可能です。名前の参照はvalであり、varではないので、参照が上書きされず、オブジェクトが変更されても常に同じオブジェクトを指します。

不変のマップへのvar参照を作成して、逆の効果を作成することができます。あなたの第2のケースで

2

は、名前がmutable.HashMappointer指していると、あなたはそれを編集しなかった理由を明示的hashmapmutableとしてのthatsを定義している

name("Hello") = 1 

hashMapを編集しています。しかし、あなたは

name = new scala.collection.mutable.HashMap[String, Int] 

と同じnameを持つ別のobjectreferenceにことはできませんが、あなたはでは、他のobjects

関連する問題