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) # 14lambda は似ていますがより厳格で、渡す引数の数が正しいかどうかをチェックします。アロー形式 -> が一般的な記法です:
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 を使用します。
チャレンジ
簡単1つの数値を受け取り、それを3倍にして返すtriplerという名前のlambdaを作成してください。
次に、カンマ区切りの整数のリストを読み込み、以下を改行して出力してください:
tripler.call(10)を呼び出した結果- 入力された各数値を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 する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ