スポンサーリンク

2015年8月19日

[Elixir]連想データ構造を習得する

とある錬金術師の万能薬(Elixir)

Goal

Elixirの連想データ構造を習得する。

Dev-Environment

OS: Windows8.1
Erlang: Eshell V6.4, OTP-Version 17.5
Elixir: v1.0.4

Wait a minute

連想データ構造について学びます。
どの言語でも大概存在するデータ構造なので、
使い方を覚えることと注意点の把握で十分ですね。
さっさと終わらせましょう。

Index

Associative data structure
|> Keyword lists
|> Maps
|> Dicts
|> Extra

Keyword lists

キーワードリストについて。
簡単なまとめ・・・
  • 2要素のタプルをリストにしたもの
  • 最初の要素はアトム
  • キーの順序を指定したとおりに保持
  • 同じキーを複数回与えられる
  • 線形の性能特性である
使い方・・・
iex> list = [{:a, 1},{:b, 2}]
[a: 1, b: 2]
iex> list[:a]
1
変数の値を見てみます。
iex> list
[a: 1, b: 2]
値を束縛した時とは、値が違いますね。
上記のような表示になると言うことは、
以下は等価であると言うこと。
iex> [a: 1, b: 2] == [{:a, 1}, {:b, 2}]
true
そしてリストであると言うことは・・・
以下のようなことができますね。
iex> list = [a: 3] ++ list
[a: 3, a: 1, b: 2]
同じキーがあります。
アクセスするとどちらが取得できるでしょうか?
iex> list[:a]
3
詳しい操作については、ドキュメントを参照すること。
hexdocs - v1.0.5 Elixir Enum
hexdocs - v1.0.5 Elixir List
hexdocs - v1.0.5 Elixir Keyword

Maps

マップについて。
簡単なまとめ・・・
  • キーバリューストア
  • キーはどんな値でもよい
  • キーは順番通りにならない
  • 同じキーなら最後の要素が優先される
使い方・・・
iex> map = %{:a => 1, "b" => 2}
%{:a => 1, "b" => 2}
iex> map.a
1
iex> map["b"]
2
キーがアトムなら以下のようにも定義できる。
iex> map = %{a: 1, b: 2}
%{a: 1, b: 2}
以前に書いたが、マップでのパターンマッチは非常に柔軟にできる。
iex> map = %{"hoge" => 1, "huge" => 2, "foo" => "bar"}
%{"foo" => "bar", "hoge" => 1, "huge" => 2}
iex> %{"hoge" => hoge} = map
%{"foo" => "bar", "hoge" => 1, "huge" => 2}
iex> hoge
1
空のマップならどんなマップにもマッチする。
iex> %{} = %{"foo" => "bar", "hoge" => 1, "huge" => 2}
%{"foo" => "bar", "hoge" => 1, "huge" => 2}
詳しい操作については、ドキュメントを参照すること。
hexdocs - v1.0.5 Elixir Enum
hexdocs - v1.0.5 Elixir Map

Dicts

ディクショナリについて。
簡単なまとめ・・・
  • ディクショナリはビヘイビア(インターフェース)
Description:
キーワードリスト、マップのどちらもディクショナリと呼ばれる。
その理由は、ディクショナリのビヘイビアを実装して作られているため。
詳しい使い方は、ドキュメントを参照。
hexdocs - v1.0.5 Elixir Dict
こういうのもあるようです。
hexdocs - v1.0.5 Elixir HashDict

Extra

記事に対して、全く関連性のない話題・・・
関数の引数にデフォルトの値を与える方法。
iex上からだとバックスラッシュ使えなかったので、.exファイルを作成します。
ファイル名は何でもいいです。
Example:
defmodule Test do
  def test1(a \\ 1) do
    IO.puts a
  end

  def test2(b \\ nil) do
    IO.puts b
  end
end
Description:
引数名 \\ 値 とするとデフォルトの値を与えることができます。
定義したモジュールと関数を使ってみます。
>iex [file_name].ex

iex> Test.test1
1
:ok
iex> Test.test1(2)
2
:ok
iex> Test.test2

:ok

Speaking to oneself

特に難しい点はなかったですね。
次は、ようやっとモジュールについて。

Bibliography

人気の投稿