Rubyist が違和感なく使える Elixir メソッドを取り上げてみました。
Elixir は Ruby に似ているだけあって、Rubyist が使い始めてもそこまで違和感なく始められると思います(Erlang周りを全然理解していない私の言葉なので信頼性にかけますが。。。)。
ということで以下とり上げてみます(オレ基準)。紹介していないものも結構あるので興味ある人はドキュメント見てみると良いです。
inject vs reduce
Elixir は reduce 派でした。
[1, 2, 3, 4, 5].inject(1) { |acc, x| acc + x }
[1, 2, 3, 4, 5].inject { |acc, x| acc + x }
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 派
[1, 2, 3].select { |x| x == 2 }
Enum.filter([1, 2, 3], fn(x) -> x == 2 end)
reject
[1, 2, 3].reject { |x| x == 2 }
Enum.reject([1, 2, 3], fn(x) -> x == 2 end)
find
[1, 2, 3].find { |x| x == 2 }
Enum.find([1, 2, 3], fn(x) -> x == 2 end)
map
[1, 2, 3].map { |x| x * 2 }
Enum.map([1, 2, 3], &(&1 * 2))
join
[1, 2, 3].join(",")
Enum.join([1, 2, 3], ",")
each
["a", "b"].each { |s| puts s }
Enum.each(["a", "b"], &IO.puts(&1))
empty?
[].empty?
Enum.empty?([])
sort
ちょっと Elixir の引数順序が違和感ありますかね。。
[1, 2, 3].sort { |a, b| b <=> a }
Enum.sort([1, 2, 3], fn(a, b) -> a > b end)
reverse
[1, 2, 3].reverse
Enum.reverse([1, 2, 3])
uniq
[1, 2, 3, 2, 1].uniq
Enum.uniq([1, 2, 3, 2, 1])
each_with_index vs with_index
> [1, 2, 3].each_with_index.map { |v, i| [v, i] } # 理解しやすくするため map を挟んでます
=> [[1, 0], [2, 1], [3, 2]]
iex(18)> Enum.with_index [1, 2, 3]
[{1, 0}, {2, 1}, {3, 2}]
flat_map
[[1,2], [3,4]].flat_map { |s| s }
Enum.flat_map([[1, 2], [3, 4]], &(&1))
zip
[:a, :b].zip([1, 2])
Enum.zip([:a, :b], [1, 2])
まとめ
普段よく使っているメソッドの比較をして並べてみました。ほぼ同じでほとんど比較している意味がない。。。
使い勝手は Ruby と似ているので、Rubyist は苦労しなさそうです。ただし、Erlang の特徴だったりを理解するのは、また別の話かなと思います(少なくとも自分にとってまだ理解できていないこと多い)。
Enum 編と書きましたが、頑張って色々まとめようとして Enum のみで力尽きて、ここに落ち着いた感じですので、特に続く予定はないです。
これは Elixir Advent Calendar 2013 の 23 日目です。明日はというか今日は @keithseahus さんです。というかもう公開されていますね。内容が濃くて素晴らしい。