Menu
Coddy logo textTech

Proc とラムダ

CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 19/56。

ブロックはオブジェクトではないため、変数に格納することはできません。持ち運んだり、保存したり、後で呼び出したりできるコードの断片が必要な場合は、それを Proc または lambda でラップします。

Procは、Proc.newまたはprocキーワードで作成されます。.callで呼び出します:

double = proc { |n| n * 2 }
puts double.call(5)   # 10
puts double.call(7)   # 14

ラムダ(lambda)は似ていますが、より厳密で、正しい数の引数が渡されているかをチェックします。アロー形式の -> が一般的な書き方です:

square = ->(n) { n * n }
puts square.call(4)   # 16
puts square.(4)       # 16  # (.call の短縮形)

どちらも、&を前に付けることで、ブロックを期待するメソッドに渡すことができます:

[1, 2, 3].map(&double)   # [2, 4, 6]
[1, 2, 3].map(&square)   # [1, 4, 9]

より厳密な引数チェックが必要な場合は lambda を使用し、より軽量で寛容な動作が必要な場合は Proc を使用してください。

challenge icon

チャレンジ

簡単

1つの数値を受け取り、それを3倍にして返す tripler という名前のラムダを作成してください。

次に、カンマ区切りの整数のリストを読み込み、以下の内容を別々の行に出力してください:

  1. tripler.call(10) を呼び出した結果
  2. 入力された各数値を3倍し(map(&tripler) を使用)、, で連結したもの

入力が 1,2,3 の場合、出力は以下のようになります:

30
3, 6, 9

チートシート

Proc – 変数に格納された再利用可能なブロック:

double = proc { |n| n * 2 }
double.call(5)   # 10

Lambda – より厳密な引数チェック、アロー構文:

square = ->(n) { n * n }
square.call(4)   # 16
square.(4)       # 16 (短縮形)

& を使用して、ブロックを期待するメソッドに Proc/lambda を渡します:

[1, 2, 3].map(&double)   # [2, 4, 6]

自分で試してみよう

# TODO: triplerをラムダとして定義する

numbers = gets.chomp.split(",").map(&:to_i)

# TODO: 1行目、tripler.call(10)を出力する
# TODO: 2行目、numbersを&triplerでマップし、", "で結合する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン