を行うことができますが、代わりにscala.collection.mutable.ListBuffer
を使用することをお勧めします空のNil
は最初と最後の要素です)。
"primitive charm"のようになります。したがって、{Nil、newElement}のような結果を得るために、Nil
以降に新しいデータを追加/追加しようとしません。もちろん
はそれがif
リストが空でチェックすることができます(すべてのNil
した後、最後の要素でなければなりません)その後、最後まで先頭にaddingList
とNil
を置きます。しかし、これは「あまりにも賢い」と思います。
しかし、いずれにせよappend()
このような結果「期待」を返します。この場合は
val addingList = new LinkedList[String]("a", "b")
val result = emptyList append addingList
result = {"a", "b"}.
それは返す「addingList」自体、および/しかし、最初のリストは変更されません。
我々はnext
refにnewElementを割り当てようとした場合:
LinkedList(null, whatever)
すなわち:結果
emptyList.next = LinkedList("whatever")
我々はemtyListは次のように変更されていますのようにfist要素を作成するのは、next()
に新しい/次の要素を割り当てるためです。したがって、最初の要素がヌルであるため、次に追加した新しい要素(addingElelement
)を参照するため、Nilを最後まで移動します。
「『emptyListがNil
である私たちのケースヘッドでヘッド『リンク』
と頭』もある」、それはしなければならないのでNill
は、次のことはできませんので、新しいaddingElelement
のnext()refereceで新しい最初の要素(null値を持つ)を作成します。
個人的に私はそれが「あまりにも原始的」で「あまりにもエレガント」ではないことがわかります。しかし、それは依存していると思います。
タスク指向の物語:私の最初のタスクのために
(私はこの「奇妙な」リストの行動について考え始めるなぜ[これは変更可能だにもかかわらず]) - 私はクラス/オブジェクトに対して変更可能なリストを使用していましたDictionary
と呼ばれ、Words
を保持します(デフォルトでは、辞書には単語がありません)。そして、私は新しい単語を追加するためのddWord(wod:String)
のようなメソッドを持っています。
object Dictionary {
val words = new mutable.MutableList[Word]();
def addWord(word: Word): Unit = {
words += word;
}
}
しかし、可能な実装は次のように次のようになります。今の私の実装では、(私はこのLinkedList
を使用するつもりはないが、むしろMutableList
それはそれは前のものよりより変更可能ようです)に変更されます:
object Dictionary {
var words = new mutable.LinkedList[Word]();
def addWord(word: Word): Unit = {
if (words.isEmpty) {
words = words append(mutable.LinkedList[Word](word)) // rely on append result
} else {
words append(mutable.LinkedList[Word](word))
}
}
}
しかし、私はvar
の代わりval
を使用する必要があり、私はにすべての新しいのWordを変換する必要があります、私の論理はもっと複雑になった。
なぜこの動作ですか?なぜ要素の数に関係なく自己に追加しないのですか?これは 'mutable'コレクションから期待されるものではありませんか? – weima
私は考えがありません。正確な理由を知りたければ、公式のscalaメーリングリストを試してみるべきです。 – drexin
実際にリストを変更するよりもずっと安いからだと思います。 IMHOは、実際に突然変異操作が突然変異を起こすという暗黙の契約を破っている。 – dOxxx