はじめに
elixirのコレクションを理解する
解説
コレクションとは
ITの分野では、複数の要素を格納できる複合的なデータ構造をこのように呼ぶことが多い。
リスト
リストは値の単純なコレクションで、複数の型を含むことができます。また、一意ではない値を含むことができます:
list = [3.14, "test", :pie]
> [3.14, "test", :pie]
タプル
タプルはリストに似ていますが、各要素はメモリ上に隣接して格納されます。 このため、タプルの長さを得るのは高速ですが、修正を行うのは高コストとなります。というのも、新しいタプルは全ての要素がメモリにコピーされるからです。タプルは波括弧を用いて定義されます:
tuple = {3.14, "test", :pie}
> {3.14, "test", :pie}
キーワードリスト
キーワードリストとマップはElixirの連想コレクションです。Elixirでは、キーワードリストは最初の要素がアトムのタプルからなる特別なリストで、リストと同様の性能になります:
sample_list = [test: hoge]
sample_list[:test]
key_list = [pie: 3.14, all: 42]
> [pie: 3.14, all: 42]
# another version
key_list_another = [{:pie, 3.14}, {:all, 42}]
> [pie: 3.14, all: 42]
別の書き方もできるが出力させると上記の書き方になるためあまり有用性はなさそう。
けど一応覚えておかないとコードを読むときに不便しそうではある。
マップ
Elixirではマップは”花形の”キーバリューストアです。 キーワードリストとは違ってどんな型のキーも使え、順序付けされません。 マップは %{} 構文で定義することができます:
map = %{:name => "hoge", "12" => :id}
> %{:name => "hoge", "12" => :id}
ちなみに
pythonやJavaだとこういう書き方でリストを表現する
紛らわしいのでelixirを書いているときは気を付けて下さい
python
python_list = ["test", "hoge", "hey"]
python_list[0]
> "test"
Java
int[] result = new int[3];
result[0] = 1
result[1] = 2
result[2] = 3
result[1]
> 2
おわりに
なまじ色々なコードを触った経験があると基礎的な内容が疎かになったり年月とともに記憶が混濁してしまうのかもしれません。
今回知識を整理してキチンと理解に落とし込めるように記事に書き起こしました。
参考サイト