Elixirに置いて、Keyword listはTupleで表現される。
[{a, b}, {c, d}]
なので、
@hw %{
1 => "hello",
2 => "world"
}
hw |> Enum.filter(fn {key, _} -> key == 1 end) |> Keyword.values
のようなパイプを書いた時、取得されるのは ["hello"] になる。
ここで、Elixir v1.2.3 の Keyword.valuesの中身を覗いてみると、以下のようにmapを適用した中でTupleからちょうどvalueを取得してListを作って返している。
@spec values(t) :: [value]
def values(keywords) when is_list(keywords) do
:lists.map(fn {_, v} -> v end, keywords)
end
当初、
[hello: "world", inu: "neko"] # Elixir
しか Keyword 系は使えないと思っていたけれど、Erlangレベルでは
[{hello, "world"}, {inu, "neko"}] # Erlang
なので、Keyword listとみなしてKeyword操作ができるのですね。学びだ。
蛇足だけれど、 Enum.any?/2 と言う、処理の途中で要素が見つかったらtrueを返す用途で使うfunctionも教えてもらった。なるほど。