Elixir GUIDES を普通に読む8

Elixir GUIDES を読んだメモ

elixir-lang.jp

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 を用いると異なるデータ構造に挿入することができる

rei19.hatenablog.com

  • わかりやすかった

  • あまり賢くないのでモチベが落ちてきている気がする

  • モチベが落ちてきたので Phoenix触るやってみようかな