Rubyist が違和感なく使える Elixir メソッド - Enum 編

  • 22
    Like
  • 0
    Comment
More than 1 year has passed since last update.

Rubyist が違和感なく使える Elixir メソッドを取り上げてみました。

Elixir は Ruby に似ているだけあって、Rubyist が使い始めてもそこまで違和感なく始められると思います(Erlang周りを全然理解していない私の言葉なので信頼性にかけますが。。。)。
ということで以下とり上げてみます(オレ基準)。紹介していないものも結構あるので興味ある人はドキュメント見てみると良いです。

inject vs reduce

Elixir は reduce 派でした。

Ruby
[1, 2, 3, 4, 5].inject(1) { |acc, x| acc + x }
[1, 2, 3, 4, 5].inject { |acc, x| acc + x }
Elixir
Enum.reduce([1, 2, 3, 4, 5], 1, fn(x, acc) -> x + acc end)
Enum.reduce([1, 2, 3, 4, 5], fn(x, acc) -> x + acc end)

select vs filter

Elixir は filter 派

Ruby
[1, 2, 3].select { |x| x == 2 }
Elixir
Enum.filter([1, 2, 3], fn(x) -> x == 2 end)

reject

Ruby
[1, 2, 3].reject { |x| x == 2 }
Elixir
Enum.reject([1, 2, 3], fn(x) -> x == 2 end)

find

Ruby
[1, 2, 3].find { |x| x == 2 }
Elixir
Enum.find([1, 2, 3], fn(x) -> x == 2 end)

map

Ruby
[1, 2, 3].map { |x| x * 2 }
Elixir
Enum.map([1, 2, 3], &(&1 * 2)) 

join

Ruby
[1, 2, 3].join(",")
Elixir
Enum.join([1, 2, 3], ",")

each

Ruby
["a", "b"].each { |s| puts s }
Elixir
Enum.each(["a", "b"], &IO.puts(&1))

empty?

Ruby
[].empty?
Elixir
Enum.empty?([])

sort

ちょっと Elixir の引数順序が違和感ありますかね。。

Ruby
[1, 2, 3].sort { |a, b| b <=> a }
Elixir
Enum.sort([1, 2, 3], fn(a, b) -> a > b end)

reverse

Ruby
[1, 2, 3].reverse
Elixir
Enum.reverse([1, 2, 3])

uniq

Ruby
[1, 2, 3, 2, 1].uniq
Elixir
Enum.uniq([1, 2, 3, 2, 1])

each_with_index vs with_index

Ruby
> [1, 2, 3].each_with_index.map { |v, i| [v, i] } # 理解しやすくするため map を挟んでます
=> [[1, 0], [2, 1], [3, 2]]
Elixir
iex(18)> Enum.with_index [1, 2, 3]
[{1, 0}, {2, 1}, {3, 2}]

flat_map

Ruby
[[1,2], [3,4]].flat_map { |s| s }
Elixir
Enum.flat_map([[1, 2], [3, 4]], &(&1))

zip

Ruby
[:a, :b].zip([1, 2])
Elixir
Enum.zip([:a, :b], [1, 2])

まとめ

普段よく使っているメソッドの比較をして並べてみました。ほぼ同じでほとんど比較している意味がない。。。

使い勝手は Ruby と似ているので、Rubyist は苦労しなさそうです。ただし、Erlang の特徴だったりを理解するのは、また別の話かなと思います(少なくとも自分にとってまだ理解できていないこと多い)。

Enum 編と書きましたが、頑張って色々まとめようとして Enum のみで力尽きて、ここに落ち着いた感じですので、特に続く予定はないです。

これは Elixir Advent Calendar 2013 の 23 日目です。明日はというか今日は @keithseahus さんです。というかもう公開されていますね。内容が濃くて素晴らしい。