Ruby线程:不知何故,类字段变为零

时间:2013-07-12 15:08:32

标签: ruby multithreading

我正在尝试使用多个房间在Ruby上实现套接字服务器,例如,人们可以相互发送聊天消息。

代码非常简单: 主文件:

require 'room'  
require 'socket'
room = Room.new

### handle connections
Thread::abort_on_exception=true
server = TCPServer.open(2000)   # Socket to listen on port 2000
puts 'Open socket at 2000 port'
loop {                          # Servers run forever
  room.handle_player server.accept
}

room.rb

require 'player'
class Room
  @players = []

  attr_accessor :players

  def initialize

  end

  def handle_player(connection)
    puts ' New client connected!'
    Thread.start(connection, self) do |client, room|
      player = Player.new connection, room
      @players.push player
    end
  end

  def broadcast(message)
    puts "Players is #{@players.class}" #NilClass !
  end
end

player.rb

class Player
  def initialize(connection, room)
    @room = room
    while line = connection.gets
      puts 'got line ' + line
      room.broadcast line
    end
  end
end

问题在于,当我从播放器调用Room#广播时 - 它告诉我@players是零,但事实并非如此!怎么会这样? 我不确定我做的一切都是正确的(我的感觉告诉我玩家不应该直接链接到房间),但它简化了示例。

2 个答案:

答案 0 :(得分:1)

这与线程无关。

您应该将初始化@players = []放入initialize的{​​{1}}。

您拥有它的方式,不要初始化对象的实例变量,而是初始化类Room的实例变量。

答案 1 :(得分:1)

您将@players设置为Room的类实例变量。

而不是这个,你应该把它放在你的initialize方法中:

def initialize
  @players = []
end