railsタグに釣られたそこのあなた!elixirを少しやってみませんか!?
Regex.runがマッチしない時nilを返すのでついカッとなって書いた反省はしていない
rubyist(rails使ってる人だけ?)にはお馴染みのtry
と同じようなことがしたいので作ってみました。
ruby(rails)のtry
を知らない方のために説明すると、「nil
なら何もせずにnil
を返して、nil
でなければ与えられた処理をするメソッド」です。非常にシンプルなので実装を見たほうが分かりやすいと思います。
作る
すでにKernel.SpecialForms.try
という関数があるので、とりあえずattempt
という名前にします(短くて良いネーミング緩募)
defmodule Attempt do
def attempt val, fun do
unless is_nil val do
fun.(val)
end
end
end
使ってみる
before
> 25 |> Integer.to_string
"25"
> nil |> Integer.to_string
** (ArgumentError) argument error
:erlang.integer_to_binary(nil)
nil
にInteger.to_stringを適用しようとして悲しいことになっています。
after
> import Attempt
> 25 |> attempt(&Integer.to_string/1)
"25"
> nil |> attempt(&Integer.to_string/1)
nil
良い感じですね。パイプラインと&
が良い仕事しています。パイプライン万歳。
マクロにできそうな気がするけど、マクロがよく分かってないのでマクロ版はそのうち。
おまけ
railsタグが付いているのにelixirの話を読まされてご立腹の方のためにrubyの小ネタをば。
def double a
a * 2
end
2.try(&method(:double)) #=> 4
オブジェクトのメソッドならば&
+ シンボルでブロックの代わりになることは有名ですが、名前空間なしで呼び出せるメソッド(同じクラスのメソッドとかKernelのメソッド)の場合はmethod
メソッドを使うことで&
を使って書くことができます。