[Elixir]Keywordの中身はTupleのList

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も教えてもらった。なるほど。

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s