Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 将“应用程序数据”与现有IO对象关联_Ruby - Fatal编程技术网

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类型进行额外的哈希查找?是的!正是我想要的。去哪里?这是我第一次看到它。事实上,我也不熟悉它,我推断到,到,等等。。。我猜是红宝石的方式…:-猜对了!我没想到会这样。谢谢