2

Ruby でクラスを拡張Stringして、すべてのインスタンスにタイムスタンプ ID を関連付けました。現時点での様子は次のとおりです。

 class String
        attr_accessor :id

        def get_timestamp
            @id ||= Time.now.nsec.to_i
            return @id
        end 
 end

ネットワーク経由でこの文字列をシリアル化していますが、ネットワークの反対側で受信すると String オブジェクトの ID が失われます。関連する ID が保持されるように、文字列をシリアル化および逆シリアル化する方法を知りたいです。

4

1 に答える 1

1

このように Ruby クラスにモンキーパッチを適用することは、通常、悪い習慣と見なされます。おそらく、別のクラスを生成したいと思うでしょう。

呼び出しにさらに情報を含めるには、onsocket.write "#{message}\r\n"をオーバーライドする必要があります。ただし、注意してください!そのメソッドは通常多くの場所で呼び出されるため、これはほぼ確実に問題を引き起こします。to_sString

コードでこれを何に使用しているのかわかりませんので、おそらくより良い名前を選択する必要がありますが、次のようにすることもできます。

class StringWithID
  attr_reader :id, :string

  def self.from_network(bytes)
    id, string = bytes.unpack("Qm0")
    new(id, string)
  end

  def initialize(id = nil, string)
    @id = id || Time.now.nsec.to_i
    @string = string
  end

  def to_s
    @string
  end
  alias :to_s :to_str

  def to_network
    [@id, @string].pack("Qm0")
  end
end

次に、次のように呼び出すことができます。

str = StringWithID.new("some string")
socket.write "#{str.to_network}\r\n"

そして、ネットワークの反対側で:

str = StringWithID.from_network(socket.gets)
于 2013-07-17T20:46:42.987 に答える