Ruby 将“应用程序数据”与现有IO对象关联
我有一门课:Ruby 将“应用程序数据”与现有IO对象关联,ruby,Ruby,我有一门课: class MyProgram attr_reader :control_socket def initialize @control_socket = UNIXSocket.new('path/to/socket') ... end def read_message ... end end 我想选择该程序的多个实例,如下所示: # Does not work programs = [my
class MyProgram
attr_reader :control_socket
def initialize
@control_socket = UNIXSocket.new('path/to/socket')
...
end
def read_message
...
end
end
我想选择该程序的多个实例,如下所示:
# Does not work
programs = [my_pgm1, my_pgm2]
io_wrappers = programs.collect { |p| wrap(p) }
r, w, err = select(programs)
r.each { |pgm|
pgm.my_program.read_message
}
我想知道是否有办法包装UNIXSocket以将MyProgram与之关联。如何将套接字映射回各自的程序
programs = [my_pgm1, my_pgm2]
sockets = Hash[programs.map { |p| [p.control_socket, p] }
r, w, err = select(sockets.keys)
r.each { |socket|
sockets[socket].read_message
}
更新:
我没有对此进行测试,但您可以尝试创建显式转换:
class MyProgram
def to_io
control_socket
end
end
programs = [my_pgm1, my_pgm2]
r, w, err = select(programs)
r.each { |pgm|
pgm.read_message
}
请发表评论,关于为什么要向下投票,请关闭。我不希望MyProgram从IO继承。我真的不希望MyProgram从传递给select的IO对象中获取关联的MyProgram实例,而不使用IO到MyProgram实例的哈希。我编辑了这个问题以反映这一点。这就是我目前正在做的。也许我对ruby的理解很差,但我认为有一种方法可以避免使用duck类型进行额外的哈希查找?是的!正是我想要的。去哪里?这是我第一次看到它。事实上,我也不熟悉它,我推断到,到,等等。。。我猜是红宝石的方式…:-猜对了!我没想到会这样。谢谢