Proc
再利用できるブロックオブジェクトです。
「Proc」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。
再利用可能なブロックオブジェクト
ブロックはそれ自体がオブジェクトではないため、変数に保存できません。Procはブロックを実際のオブジェクトに包み、保存したり、受け渡したり、後から呼び出したりできるようにします。
greeter = Proc.new { puts "Hello!" }
greeter.call
greeter.callProcの作成
Procを作成する一般的な方法は2つあります。Proc.new { ... }と、より短く書けるKernelメソッドのproc { ... }です。どちらも同じ種類のオブジェクトを生成します。
double = proc { |x| x * 2 }
p double.call(5)Procの呼び出し
Procは、.call、.()、角括弧による省略記法[ ]など、複数の方法で呼び出せます。どれも同じ動作をします。
square = proc { |x| x * x }
puts square.call(4)
puts square.(4)
puts square[4]Procは引数を受け取る
Procはブロックと同じように、パイプの間にパラメータを宣言して受け取ります。
add = proc { |a, b| a + b }
puts add.call(3, 7)配列へのProcの格納
Procはオブジェクトなので、振る舞いのコレクションとして保持し、順番に実行できます。
ops = [proc { |x| x + 1 }, proc { |x| x * 2 }]
result = 5
ops.each { |op| result = op.call(result) }
puts resultProcをブロックとして渡す
ブロックを受け取るメソッドに渡すには、Procの前に&を付けます。RubyがProcを再びブロック形式に戻します。
printer = proc { |n| puts "Item: #{n}" }
[1, 2, 3].each(&printer)ブロックをProcとして捕捉する
逆の操作も可能です。メソッドのシグネチャで&blockを使うと、渡されたブロックを保存可能なProcとして捕捉できます。
def make_handler(&block)
block
end
h = make_handler { |msg| puts "Got: #{msg}" }
h.call("ping")Procの引数個数は厳密ではない
重要な特徴として、Procは引数の数が正しくなくてもエラーにしません。不足した引数はnilになり、余分な引数は無視されます。
p1 = proc { |a, b| puts "a=#{a.inspect} b=#{b.inspect}" }
p1.call(1)
p1.call(1, 2, 3)Procとreturn
Proc内のreturnは、Procだけでなく、それを囲むメソッドから戻ります。予想外の動作になることがあるため、注意が必要です。
def demo
p = proc { return 10 }
p.call
20 # never reached
end
puts demoProcは周囲の環境を捕捉する
Procは、定義された場所でスコープ内にあった変数を記憶します。この性質によりProcはクロージャになります。クロージャについては後で詳しく学びます。
factor = 3
times_factor = proc { |n| n * factor }
puts times_factor.call(10)まとめ
Procを使うと、ブロックを第一級オブジェクトにできます。
proc { }またはProc.newで作成します。.call、.()、または[ ]で実行します。&を使ってメソッドに渡します。- 引数の数に寛容で、メソッドレベルの
returnを使用します。
pipeline = [proc { |s| s.upcase }, proc { |s| s + "!" }]
text = "hello"
pipeline.each { |step| text = step.call(text) }
puts text理解度チェック
Procについての理解度を確認しましょう。
振り返り
Procについて学んだことを振り返りましょう。
- Procは、ブロックをオブジェクトとして包んだものです。
procまたはProc.newで作成し、.callで実行します。&を使ってメソッドに渡します。- 引数の数の不一致を許容し、メソッドレベルの
returnを使用します。
shout = proc { |word| puts word.upcase }
shout.call("ruby")よくある質問
「Proc」レッスンは無料ですか?
はい。「Proc」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。
「Proc」で何を学びますか?
再利用できるブロックオブジェクトです。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Ruby Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「Proc」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このRuby Academyレッスンでコードを書いて実行できますか?
はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。