Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【Ruby3.x】Ractor::receive_if()メソッドの使い方

receive_ifメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

receive_ifメソッドは、Ractorオブジェクト間でメッセージを送受信する際に、特定の条件に合致するメッセージのみを選択的に受け取るためのメソッドです。このメソッドはブロックを引数に取り、Ractorのメッセージキューに蓄積された各メッセージに対してそのブロックを評価します。ブロックが真を返した最初のメッセージが、このメソッドの戻り値として返されます。

ブロックにはキューから取り出されたメッセージが引数として渡され、開発者はこのブロック内でメッセージの内容や種類に基づいて、受け取るべきメッセージの条件を記述します。例えば、特定の文字列を含むメッセージや、特定の型を持つメッセージだけを受け取るといった条件を設定できます。

もし条件に合致するメッセージがキュー内に見つからない場合、receive_ifメソッドは新しいメッセージが到着するか、あるいは条件に合うメッセージが利用可能になるまで、現在のRactorの実行をブロック(待機)します。これにより、Ractorは不必要なメッセージを処理することなく、本当に必要な情報だけを効率的に待機し、処理を開始できます。この機能は、複数の異なるタスクやRactorから様々な種類のメッセージを受け取るシステムにおいて、特定のイベントやデータに反応する柔軟な並行処理を実現する上で重要な役割を果たします。

構文(syntax)

1receiving_ractor = Ractor.new do
2  # Ractor.receive_if は、メッセージキューから、
3  # 与えられたブロックが真を返す最初のメッセージを受信します。
4  # ブロックには、評価対象のメッセージが引数として渡されます。
5  received_message = Ractor.receive_if do |message|
6    # 条件: 受け取りたいメッセージが特定の文字列である場合
7    message == "target_message"
8  end
9  received_message # => "target_message" が返される
10end
11
12# メインRactorから複数のメッセージを送信
13receiving_ractor.send("other_message_1")
14receiving_ractor.send(123)
15receiving_ractor.send("target_message") # このメッセージが receiving_ractor で受信される
16receiving_ractor.send("other_message_2")
17
18# receiving_ractor の完了を待つ
19receiving_ractor.take

引数(parameters)

引数なし

引数はありません

戻り値(return)

Object

指定された条件に合致するRactor#receive_ifの戻り値の説明を以下に示します。

実行ブロックが評価され、真を返した場合、そのブロックに渡されたオブジェクトを返します。それ以外の場合は nil を返します。

関連コンテンツ