Procと自己代入演算子を利用してブロックの評価値を変数に即時代入する

Ruby

Procクラスはブロックをオブジェクト化するクラスです。
Procオブジェクトとは、Procクラスを利用してオブジェクト化されたブロックのインスタンスのことを指します。

Procオブジェクトを利用することでブロックの評価値を変数にセットできます。

### Procオブジェクトの作成
message_proc = proc {
  "Hello"
}

### ブロック引数を利用するメソッドの定義
def message_method(&block)
  block.call
end

### Procオブジェクトをメソッドの実引数に利用し、結果を変数にセット
@message = message_method(&message_proc)

@message
=> "Hello"

上記の例は以下のようにProcオブジェクトを直接呼び出す方法に書き換えられます。

### Procオブジェクトの作成
message_proc = proc {
  "Hello"
}

### Procオブジェクトを呼び出し、結果を変数にセット
@message = message_proc.call

@message
=> "Hello"

Procオブジェクトは作成と呼び出しを同時に行うことができます。この特性を利用することでブロックの評価値を変数にそのまま代入できます。
自己代入演算子(||=)と組み合わせると上記のコードは以下のように書き換えられます。

### Procオブジェクトの作成・呼び出し、結果を変数にセットを一度に実行
@message ||= proc {
  "Hello"
}.call

@message
=> "Hello"

引数を利用する場合は以下のようになります。

### 実引数の定義
friend = "Bob"

### callの実引数がProcオブジェクトの仮引数に渡される
@message ||= proc do |name|
  "Hello #{name}"
end.call(friend)

@message
=> "Hello Bob"

さいごに

Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!

参考