fork download
  1. class Node
  2. attr_accessor :name, :msg_q
  3.  
  4. def initialize(name, &block)
  5. @name = name
  6. @block = block # ← 初期化時のブロックを保持
  7. @msg_q = {
  8. ms: [],
  9. ms_private: []
  10. }
  11. end
  12.  
  13. # --- update:ブロックを実行 ---
  14. def update
  15. @block.call(self) if @block
  16. end
  17.  
  18. # --- 送信 ---
  19. def _ms_send_private(msg)
  20. _ms_send(msg, :ms_private)
  21. end
  22.  
  23. def _ms_send(msg, mode = :ms)
  24. msg[:from] ||= self.name
  25. msg[:to] ||= nil
  26. msg[:payload] ||= []
  27. msg[:to].msg_q[mode] << msg
  28. end
  29.  
  30. # --- 受信処理 ---
  31. def _ms_proc_private
  32. while (msg = self.msg_q[:ms_private].shift)
  33. yield msg if block_given?
  34. end
  35. end
  36. end
  37.  
  38. # ----------- サンプル -----------
  39.  
  40. a = Node.new("A")
  41.  
  42. b = Node.new("B") do |self_node|
  43. # メッセージ待ち受け 毎ループ実行 .update
  44. self_node._ms_proc_private do |msg|
  45. puts "received: #{msg[:type]}, payload=#{msg[:payload].inspect}, from=#{msg[:from]}"
  46. end
  47. end
  48.  
  49. # bへメッセージ送信
  50. a._ms_send_private({
  51. from: a.name,
  52. to: b,
  53. type: "M_TEST_1",
  54. payload: ["hello"]
  55. })
  56.  
  57. [a, b].each {|m| m.update }
  58.  
Success #stdin #stdout 0.01s 8088KB
stdin
Standard input is empty
stdout
received: M_TEST_1, payload=["hello"], from=A