0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Procの解説

Posted at

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あんま使わなくね?て思っていました。
ぶっちゃけ調べてもよくわかりませんでしたね。実務でどれくらいすごいことができるのかっていうのは、これからもっと勉強して学んでいこうかなって思います。

【参考サイト】

0
0
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?