class Node
attr_accessor :name, :msg_q
def initialize(name, &block)
@name = name
@block = block # ← 初期化時のブロックを保持
@msg_q = {
ms: [],
ms_private: []
}
end
# --- update:ブロックを実行 ---
def update
@block.call(self) if @block
end
# --- 送信 ---
def _ms_send_private(msg)
_ms_send(msg, :ms_private)
end
def _ms_send(msg, mode = :ms)
msg[:from] ||= self.name
msg[:to] ||= nil
msg[:payload] ||= []
msg[:to].msg_q[mode] << msg
end
# --- 受信処理 ---
def _ms_proc_private
while (msg = self.msg_q[:ms_private].shift)
yield msg if block_given?
end
end
end
# ----------- サンプル -----------
a = Node.new("A")
b = Node.new("B") do |self_node|
# メッセージ待ち受け 毎ループ実行 .update
self_node._ms_proc_private do |msg|
puts "received: #{msg[:type]}, payload=#{msg[:payload].inspect}, from=#{msg[:from]}"
end
end
# bへメッセージ送信
a._ms_send_private({
from: a.name,
to: b,
type: "M_TEST_1",
payload: ["hello"]
})
[a, b].each {|m| m.update }
Y2xhc3MgTm9kZQogIGF0dHJfYWNjZXNzb3IgOm5hbWUsIDptc2dfcQoKICBkZWYgaW5pdGlhbGl6ZShuYW1lLCAmYmxvY2spCiAgICBAbmFtZSA9IG5hbWUKICAgIEBibG9jayA9IGJsb2NrICAgICAgIyDihpAg5Yid5pyf5YyW5pmC44Gu44OW44Ot44OD44Kv44KS5L+d5oyBCiAgICBAbXNnX3EgPSB7CiAgICAgIG1zOiBbXSwKICAgICAgbXNfcHJpdmF0ZTogW10KICAgIH0KICBlbmQKCiAgIyAtLS0gdXBkYXRl77ya44OW44Ot44OD44Kv44KS5a6f6KGMIC0tLQogIGRlZiB1cGRhdGUKICAgIEBibG9jay5jYWxsKHNlbGYpIGlmIEBibG9jawogIGVuZAoKICAjIC0tLSDpgIHkv6EgLS0tCiAgZGVmIF9tc19zZW5kX3ByaXZhdGUobXNnKQogICAgX21zX3NlbmQobXNnLCA6bXNfcHJpdmF0ZSkKICBlbmQKCiAgZGVmIF9tc19zZW5kKG1zZywgbW9kZSA9IDptcykKICAgIG1zZ1s6ZnJvbV0gICAgfHw9IHNlbGYubmFtZQogICAgbXNnWzp0b10gICAgICB8fD0gbmlsCiAgICBtc2dbOnBheWxvYWRdIHx8PSBbXQogICAgbXNnWzp0b10ubXNnX3FbbW9kZV0gPDwgbXNnCiAgZW5kCgogICMgLS0tIOWPl+S/oeWHpueQhiAtLS0KICBkZWYgX21zX3Byb2NfcHJpdmF0ZQogICAgd2hpbGUgKG1zZyA9IHNlbGYubXNnX3FbOm1zX3ByaXZhdGVdLnNoaWZ0KQogICAgICB5aWVsZCBtc2cgaWYgYmxvY2tfZ2l2ZW4/CiAgICBlbmQKICBlbmQKZW5kCgojIC0tLS0tLS0tLS0tIOOCteODs+ODl+ODqyAtLS0tLS0tLS0tLQoKYSA9IE5vZGUubmV3KCJBIikKCmIgPSBOb2RlLm5ldygiQiIpIGRvIHxzZWxmX25vZGV8CiAgIyDjg6Hjg4Pjgrvjg7zjgrjlvoXjgaHlj5fjgZEg5q+O44Or44O844OX5a6f6KGMIC51cGRhdGUKICBzZWxmX25vZGUuX21zX3Byb2NfcHJpdmF0ZSBkbyB8bXNnfAogICAgcHV0cyAicmVjZWl2ZWQ6ICN7bXNnWzp0eXBlXX0sIHBheWxvYWQ9I3ttc2dbOnBheWxvYWRdLmluc3BlY3R9LCBmcm9tPSN7bXNnWzpmcm9tXX0iCiAgZW5kCmVuZAoKIyBi44G444Oh44OD44K744O844K46YCB5L+hCmEuX21zX3NlbmRfcHJpdmF0ZSh7CiAgZnJvbTogYS5uYW1lLAogIHRvOiBiLAogIHR5cGU6ICJNX1RFU1RfMSIsCiAgcGF5bG9hZDogWyJoZWxsbyJdCn0pCgpbYSwgYl0uZWFjaCB7fG18IG0udXBkYXRlIH0K