Elixir GUIDES を普通に読む8
Elixir GUIDES を読んだメモ
16. プロトコル
defprotocol Size do @doc "Calculates the size (and not the length!) of a data structure" def size(data) end
- このSizeプロトコルはsize関数が実装されてるデータ構造を期待する
- これを持つデータ構造に実装することができる
defimpl Size, for: BitString do def size(string), do: byte_size(string) end defimpl Size, for: Map do def size(map), do: map_size(map) end defimpl Size, for: Tuple do def size(tuple), do: tuple_size(tuple) end
iex(23)> Size.size("foo") 3 iex(24)> Size.size({:ok, "hello"}) 2 iex(25)> Size.size(%{label: "some label"}) 1
Any
- Any をつけるとすべてのデータ型に対して実装できる
- ただし、
@fallback_to_any true
をつける必要がある
defprotocol Size do @fallback_to_any true def size(data) end
- 下のように実装すると Size プロトコルを実装していないデータ型は 0サイズとみなす
defimpl Size, for: Any do def size(_), do: 0 end
17. 内包表記
iex(41)> for n <- [1, 2, 3, 4], do: n * n [1, 4, 9, 16]
- 内包表記は、generators, filters, collectables で構成されている
ジェネレーターとフィルター
n <- [1, 2, 3, 4]
はジェネレーター- 内包表記に使われる値を生成する
- Enumerable なものはすべて右辺に渡すことができる
パターンマッチもサポートしている
iex(42)> values = [good: 1, good: 2, bad: 3, good: 4] [good: 1, good: 2, bad: 3, good: 4] iex(43)> for {:good, n} <- values, do: n * n [1, 4, 16]
- パターンマッチの代わりにフィルターを使用して特定の要素を選択することもできる
iex(44)> multiple_of_3? = fn(n) -> rem(n, 3) == 0 end #Function<7.126501267/1 in :erl_eval.expr/5> iex(45)> for n <- 0..5, multiple_of_3?.(n), do: n * n [0, 9]
:into
- into を用いると異なるデータ構造に挿入することができる
わかりやすかった
あまり賢くないのでモチベが落ちてきている気がする
- モチベが落ちてきたので Phoenix触るやってみようかな