Menu
Coddy logo textTech

Proc と Lambda

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

チャレンジ

簡単

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

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

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

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

30
3, 6, 9

自分で試してみよう

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

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

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

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

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

自分で練習してみよう: Rubyオンラインコンパイラ