なんかよくわからないのですが、ある日突然カリー化に興味を持ってしまいました🍛
カリー化とは
カリー化 (currying, カリー化された=curried) とは、複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること(あるいはその関数のこと)である。
カリー化 - Wikipediaより
引数が複数個あるのメソッドを「1引数のメソッドを返すメソッド」に変換してくれます。
def magic_spice(a, b, c)
a + b + c
end
> magic_spice(1, 2, 3)
=> 6
> magic_spice(1, 2)
ArgumentError: wrong number of arguments (given 2, expected 3)
引数が3つのメソッドに対して、引数を2つしか渡さないとこうなるのは当たり前ですよね。
ではこのメソッドをカリー化してみます。
Rubyでカリー化する場合は Method#curry を使います。
instance method Method#curry
十分な数の引数が与 えられると、元の Proc に引数を渡し て実行し、結果を返します。引数 の個数が足りないときは、部分適用したカリー化 Proc を返します。
# まずはprocに。
proc_magic_spice = self.method(:magic_spice).curry
=> #<Proc:0x00007fb642009ad8 (lambda)>
proc1 = proc_magic_spice.call(1)
=> #<Proc:0x00007fb645083858 (lambda)>
proc2 = proc1.call(2)
=> #<Proc:0x00007fb64300f090 (lambda)>
# ここでmagic_spiceメソッドの3つめの引数を渡すと…
proc2.call(3)
=> 6
わーい!できたー😄
ただ、Rubyでカリー化して嬉しい時ってどんな時だろう・・・