0Pricing
Ruby Academy · レッスン

Proc

再利用できるブロックオブジェクトです。

「Proc」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。

再利用可能なブロックオブジェクト

ブロックはそれ自体がオブジェクトではないため、変数に保存できません。Procはブロックを実際のオブジェクトに包み、保存したり、受け渡したり、後から呼び出したりできるようにします。

greeter = Proc.new { puts "Hello!" }
greeter.call
greeter.call

Procの作成

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 result

Procをブロックとして渡す

ブロックを受け取るメソッドに渡すには、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 demo

Procは周囲の環境を捕捉する

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ブロックの復習
  2. Proc
  3. ラムダ
  4. クロージャとスコープ
← Ruby Academyに戻る