Procとは
Procとは?
- Procとはブロックを持ち運びに便利なオブジェクトにしたものです。
- ProcはクラスなのでProc.newでオブジェクトを作る事が出来ます。
- Proc.newによって作成されたProcオブジェクトはcallで呼び出すことが出来ます。 https://qiita.com/k-penguin-sato/items/7f98335ef631ea5ce7ad
ブロックはdo ~ end
や{...}
の塊のこと。これ自体はオブジェクトではないらしい。オブジェクト指向のRubyにおいてオブジェクト以外のものは存在できないらしい。
(正直ここには未だにピンときていない)
調べれば調べるほどよく理解できずに迷宮に迷い込んでいたけれど、ブロックは確かに持ち運びづらそう。ブロックをprocでオブジェクト化して持ち運びやすくしよう!みたいな説明が一番分かりやすかった。
Procの使用例
# ブロックをProcオブジェクト化して変数に代入している sample_proc_1 = proc { |n| n * n } sample_proc_2 = Proc.new { |n| n ** 3 } # Procオブジェクトはcallメソッドで呼び出せる sample_proc_1.call(2) #=> 4 sample_proc_2.call(2) #=> 8
持ち運びしやすい!!!
メソッドから呼び出すとは?🙄
def sample_proc(&my_proc) # (&引数名)のようにメソッドの引数を宣言する # ② 呼び出し元で指定されたブロックがProcオブジェクトに変換されてる puts my_proc.call(2) # ③ 渡されたブロック引数をcallメソッドで呼び出すことができる end sample_proc { |n| n * 2 } # ① sample_procメソッドを呼び出し時にブロック{ |n| n * 2 }を引数として渡している
なるほどeachメソッドやmapメソッドもこんなふうに定義されているのかなと思った。
def each(&引数名) # 何らかの処理 end 配列.each { ブロック }
実際の内部構造を見てみたかったけれど、調べても出てこなかったので合っているのかは分かりません。
感想
ransackのカスタム述語に出てきたprocが何か分からずに調べましたが、かなり難しく感じました。Rubyのオブジェクトについて勉強する時、実際の使用例が見えづらいのが理解に苦しむ要因だなと思います。
yieldやIambdaや何やは一気に考えるとどんどん迷い込みそうだったので省いて考えました。proc
やProc.new
以外にもProcオブジェクトを作る方法はあるとだけ覚えておきます。。
あと今はぼんやりと理解できたようなできていないような、数日後にはまた訳分からなくなってそうな程度の理解度です。難しい🥲
参考にしたサイト
RubyのProcとは?ブロック・Proc・lamdaの違いをマスター | ポテパンスタイル