1

たとえば、人々がチャットメッセージを互いに送信できるマルチプルルームを備えた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#broadcast を呼び出すと、@players が nil であると通知されますが、そうではありません! それはどうしてですか?すべてを正しく行っているかどうかはわかりませんが (私の感覚では、プレイヤーが部屋に直接リンクするべきではないと感じています)、例を単純化しています。

4

2 に答える 2

1

これはスレッドとは関係ありません。

その初期化を of に入れる必要が@players = []ありinitializeますRoom

あなたのやり方では、 object のインスタンス変数を初期化するのではなく、 class のインスタンス変数を初期化しますRoom

于 2013-07-12T15:13:08.187 に答える
1

のクラス インスタンス変数@playersとして設定します。Room

initializeこれの代わりに、これをメソッドに入れる必要があります。

def initialize
  @players = []
end
于 2013-07-12T15:13:59.707 に答える