This repository was archived by the owner on Mar 19, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcollections_1.html
More file actions
159 lines (157 loc) · 10.2 KB
/
collections_1.html
File metadata and controls
159 lines (157 loc) · 10.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<meta name="generator" content=
"HTML Tidy for Mac OS X (vers 25 March 2009), see www.w3.org" />
<title>Scala 2.8 コレクション API - 可変コレクションおよび不変コレクション</title>
<link rel="stylesheet" type="text/css" href="guide.css" />
</head>
<body dir="ltr">
<table width="100%" cellpadding="0" cellspacing="2">
<tr>
<td bgcolor="#99CCFF"><a href="collections_2.html"><img border="0"
alt="コレクション API の概要" src="next.png" /></a></td>
<td bgcolor="#99CCFF"><a href="collections_0.html"><img border="0"
alt="トップ" src="up.png" /></a></td>
<td bgcolor="#99CCFF"><img alt="" src="blank.png" /></td>
<td align="center" bgcolor="#99CCFF" width="100%">
<b>可変コレクションおよび不変コレクション</b></td>
<td bgcolor="#99CCFF" align="center" class="tocref"><a href=
"collections_49.html">目次</a></td>
</tr>
</table>
<blockquote style=
"border-left: 1px solid gray; font-family: Century, Times, 'Times New Roman', 'MS Gothic', serif; padding-left: 1em;">
最新版は <a href="http://docs.scala-lang.org/ja/overviews/collections/overview.html">Scala Documentation</a> に移行しました。
</blockquote>
<h1>可変コレクションおよび不変コレクション</h1>
<p>Scala
のコレクションは、体系的に可変および不変コレクションを区別している。<br/>
<em>可変</em> (mutable) コレクションは上書きしたり拡張することができる。これは副作用としてコレクションの要素を変更、追加、または削除することができることを意味する。<br/>
一方、<em>不変</em> (immutable) コレクションは変わることが無い。追加、削除、または更新を模倣した演算は提供されるが、全ての場合において演算は新しいコレクションを返し、古いコレクションは変わることがない。</p>
<p>コレクションクラスの全ては <tt>scala.collection</tt> パッケージもしくは
<tt>mutable</tt>、<tt>immutable</tt>、<tt>generic</tt>
のどれかのサブパッケージに定義されている。 クライアントコードに必要なコレクションのクラスのほどんどには可変性に関して異なる特性を持つ
3つの形態が定義されおり、ぞれぞれ <tt>scala.collection</tt>、<tt>scala.collection.immutable</tt>、か
<tt>scala.collection.mutable</tt> のパッケージに存在する。</p>
<p><tt>scala.collection.immutable</tt>
パッケージのコレクションは、誰にとっても不変であることが保証されている。そのようなコレクションは作成後には一切変更されることがない。したがって、異なる時点で何回同じコレクションの値にアクセスしても常に同じ要素を持つコレクションが得られることに依存できる。</p>
<p><tt>scala.collection.mutable</tt>
パッケージのコレクションは、コレクションを上書き変更する演算がある。
だから可変コレクションを扱うということは、どのコードが、何時どのコレクションを変更したのかということを理解する必要があることを意味する。</p>
<p><tt>scala.collection</tt>
パッケージのコレクションは、可変か不変かのどちらでもありうる。例えば、<a href=
"http://www.scala-lang.org/api/current/scala/collection/IndexedSeq.html"><tt>collection.IndexedSeq[T]</tt></a>
は、<a href=
"http://www.scala-lang.org/api/current/scala/collection/immutable/IndexedSeq.html"><tt>collection.immutable.IndexedSeq[T]</tt></a>
と<a href=
"http://www.scala-lang.org/api/current/scala/collection/mutable/IndexedSeq.html"><tt>collection.mutable.IndexedSeq[T]</tt></a>
両方の親クラスだ。一般的に、<tt>scala.collection</tt>
パッケージの基底コレクションは不変コレクションと同じインターフェイスを定義し、<tt>scala.collection.mutable</tt>
パッケージ内の可変コレクションは、副作用を伴う変更演算を不変インターフェイスに加える。</p>
<p>
基底コレクションと不変コレクションの違いは、不変なコレクションのクライアントは、他の誰もコレクションを変更しないという保証があるのに対し、基底コレクションのクライアントは自分ではコレクションを変更しなかったという約束しかできない。たとえ静的な型がコレクションを変更するような演算を提供していなくても、実行時の型は他のクライアントが手を加えることができる可変コレクションである可能性がある。</p>
<p>デフォルトでは Scala は常に不変コレクションを選ぶ。たとえば、<tt>scala</tt>
パッケージのデフォルトのバインディングにより、なんの接頭辞や import もなくただ <tt>Set</tt>
と書くと不変な集合 (set) が返ってき、<tt>Iterable</tt> と書くと不変で反復可能 (iterable)
なコレクションが返ってくる。可変なデフォルト実装を取得するには、<tt>collection.mutable.Set</tt>
または <tt>collection.mutable.Iterable</tt> と明示的に記述する必要がある。</p>
<p>可変と不変の両方のバージョンのコレクションを使用する場合に便利な慣例は <tt>collection.mutable</tt>
パッケージだけをインポートすることだ。</p>
<div class="quote">
<table cellspacing="1" cellpadding="0">
<tr>
<td></td>
</tr>
<tr>
<td colspan="99" align="left"><tt><font color=
"#0000E5">import</font> scala.collection.mutable</tt></td>
</tr>
</table>
</div>
<p>これにより、接頭辞なしの <tt>Set</tt>
は不変なコレクションを参照するのに対し、<tt>mutable.Set</tt> は可変のものを参照する。</p>
<p>コレクション階層内の最後のパッケージが <tt>collection.generic</tt>
だ。このパッケージには、コレクションを実装するための基本的なパーツが含まれている。 コレクションクラスがいくつかの演算を
<tt>generic</tt>内のクラスに委譲することはよくあるが、 フレームワークのユーザーが
<tt>generic</tt>内のクラスが必要になることは普通はありえない。</p>
<p>利便性と後方互換性のために、いつくかの重要な型は <tt>scala</tt>
パッケージ内に別名を定義してあるため、インポート無しで単純な名前でコレクションを使うことができる。<a href=
"http://www.scala-lang.org/api/current/scala/collection/immutable/List.html"><tt>List</tt></a>型が良い例で、以下の名前でもアクセスすることができる</p>
<div class="quote">
<table cellspacing="1" cellpadding="0">
<tr>
<td></td>
</tr>
<tr>
<td colspan="99" align="left"><tt><font color=
"#660099">scala.collection.immutable.List</font></tt>
<tt> <i>定義元</i></tt></td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td colspan="99" align="left"><tt><font color=
"#660099">scala.List</font></tt>
<tt> <i><tt>scala</tt>パッケージのエイリアス経由</i></tt></td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td colspan="99" align="left"><tt><font color=
"#660099">List</font></tt>
<tt> <i><tt>scala._</tt>
は常に自動的にインポートされるため</i></tt></td>
</tr>
</table>
</div>
<p>エイリアスされているその他の型は次のとおり: <a href=
"http://www.scala-lang.org/api/current/scala/collection/Traversable.html">
<tt>Traversable</tt></a>, <a href=
"http://www.scala-lang.org/api/current/scala/collection/Iterable.html">
<tt>Iterable</tt></a>, <a href=
"http://www.scala-lang.org/api/current/scala/collection/Seq.html"><tt>
Seq</tt></a>, <a href=
"http://www.scala-lang.org/api/current/scala/collection/IndexedSeq.html">
<tt>IndexedSeq</tt></a>, <a href=
"http://www.scala-lang.org/api/current/scala/collection/Iterator.html">
<tt>Iterator</tt></a>, <a href=
"http://www.scala-lang.org/api/current/scala/collection/immutable/Stream.html">
<tt>Stream</tt></a>, <a href=
"http://www.scala-lang.org/api/current/scala/collection/immutable/Vector.html">
<tt>Vector</tt></a>, <a href=
"http://www.scala-lang.org/api/current/scala/collection/mutable/StringBuilder.html">
<tt>StringBuilder</tt></a>, <a href=
"http://www.scala-lang.org/api/current/scala/collection/immutable/Range.html">
<tt>Range</tt></a>。</p>
<p>次の図は <tt>scala.collection</tt>
パッケージ内の全てのコレクションを示す。これらはすべて、高レベルの抽象クラスやトレイトで一般に可変と不変の両方の実装を持っている。</p>
<p><img alt="" src="collections.png" /></p>
<p>次の図は <tt>scala.collection.immutable</tt>
パッケージ内の全てのコレクションを示す。</p>
<p><img alt="" src="collections.immutable.png" /></p>
<p>そして、次の図は <tt>scala.collection.mutable</tt>
パッケージ内の全てのコレクションを示す。</p>
<p><img alt="" src="collections.mutable.png" /></p>
<p>(以上三つ全ての図は decodified.com の Matthias によって生成された。)</p>
<p>続いては、<a href="collections_2.html">コレクションAPIの概要</a></p>
<hr />
<table width="100%" cellpadding="0" cellspacing="2">
<tr>
<td bgcolor="#99CCFF"><a href="collections_2.html"><img border="0"
alt="コレクションAPIの概要" src="next.png" /></a></td>
<td bgcolor="#99CCFF"><a href="collections_0.html"><img border="0"
alt="トップ" src="up.png" /></a></td>
<td bgcolor="#99CCFF"><img alt="" src="blank.png" /></td>
<td align="center" bgcolor="#99CCFF" width="100%">
<b>可変コレクションおよび不変コレクション</b></td>
<td bgcolor="#99CCFF" align="center" class="tocref"><a href=
"collections_49.html">目次</a></td>
</tr>
</table>
</body>
</html>