手続きオブジェクト,Proc

パーフェクトRuby,誕生日に頂いたのだけど必要なときにつまみ食いするくらいで読み込んでなかったので時間のあるときに気になったところ読み進めることにする.

手続きオブジェクトとは

関数をオブジェクトとして表現したもの.Proc.newにブロックを渡すことでオブジェクトを生成し,仮引数は|name|のように縦線で囲む.Proc.callで呼び出し手続きを実行.callに渡した引数はブロックの仮引数に代入される.またProc.callの戻り値はブロックの中で最後に評価された値.

gist82c377b6770778769e04

他の記述方法

procメソッドやlambdaメソッドを使っても記述できる.他にも->を使って書くこともできる.

proc exam2

カリー化

引数として「x」と「y」のような複数の引数をとる関数にxだけを渡して,「y」を引数としてとる関数を新たに作ることをカリー化というらしい.(カリー化の関数は,関数を作る関数?) Proc#curryというメソッドでそれを実現する.

gistc2605071d407640e2da7

Procオブジェクトが生成される際に,引数の引き算を行うブロックを渡して変数subに格納している.これにcurryメソッドを使って引数の1つだけを渡している.こうすることで変数decにはもう1つの数値を引数として,引き算した結果を返す関数が格納されることになる.最後にdec.(3)とすると2つの引数による引き算が行われ,評価結果の2が帰ってくる.

アバウトだけどこういう考え方であってるのか...?あと具体的にこれをどういう場面で使うのかわからん.