Rubysilverの勉強をするなかで、ぼくが初めてみたprocというものを今回は解説していこうと思います。
(もしミスや誤解がありましたら、ご指摘のほどよろしくお願いいたします)
##ブロック
Procを理解するためには、ブロックというものを理解しないといけません。全然難しくないので、ご安心を。
ブロックというのは、簡単にいうと、do~endというやつです。例えば
each @hoges do |hoge|
~~~
end
よくみるeach文ですね。
このように、do~endで記述されるものをブロックといいます。
ここで大事なポイントなのが、ブロックはオブジェクトではないという点がポイントです。
オブジェクトに関して理解があやふやな方は、こちらの記事を読んでみてください。
オブジェクトではないことの最大のデメリットは、使いまわしができないということです。
##Proc
Procとは、先ほどブロックは、オブジェクトではないと解説しました。しかし、「やっぱ使いまわせるようにしたい!」っていうニーズが出てくるんですね。
そんなとき、役立つのがProcというものです。
具体的に解説していきます。まずは下のコードを見てください。
def add(n)
n + n
end
calculator = add #addメソッドをcalculatorという変数に代入する
=>ArgumentError: wrong number of arguments (given 0, expected 1)
from (pry):22:in `add'
なぜこのようなエラーがでてくるのか?
実は、メソッドというのはオブジェクトではないんです。
オブジェクトでないと、変数に要素を代入できないんです。そのため、addメソッドをオブジェクトにできれば、変数として使えるようになって、オブジェクト指向になるんですね。
メソッドをオブジェクトにする方法がmethodオブジェクトなんです。
先ほどのコードでいえば、
def add(n)
n + n
end
calculator = method(:add)
実際にこのコードのクラス(calculator.classをターミナルで叩いてみる)を見てみると、
=>Method
と出てきます。これによってオブジェクトとなりましたね。
methodオブジェクトに関して詳しく知りたい方はこちら
##引数で渡す場合
Procの特徴として、メソッドの仮引数のときの書き方があげられます。
def sample_proc(&sample)
puts sample.call(10)
end
sample_proc { |n| n * 2 }
こんな感じになるんですね。
さらにオブジェクトを作成しようとするとするなら、
def sample_proc(&sample)
puts sample.call(10)
end
#Procオブジェクトを生成
pro = Proc.new { |n| n * 2 }
sample_proc(&pro)
今回の記事はこれぐらいですね。正直記事書いていて、Procあんま使わなくね?て思っていました。
ぶっちゃけ調べてもよくわかりませんでしたね。実務でどれくらいすごいことができるのかっていうのは、これからもっと勉強して学んでいこうかなって思います。
【参考サイト】