gpt4 book ai didi

ruby - 在 Ruby 中序列化扩展的 String 类

转载 作者:太空宇宙 更新时间:2023-11-03 16:30:05 25 4
gpt4 key购买 nike

我扩展了 ruby​​ 中的 String 类,使其所有实例都有一个时间戳 id。这是它现在的样子:

 class String
attr_accessor :id

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

我正在通过网络序列化这个字符串,但是一旦在网络的另一端接收到 String 对象,它们就会丢失它们的 ID。我想知道如何序列化和反序列化字符串,以便保留关联的 ID。

最佳答案

像这样的 Monkeypatching Ruby 类通常被认为是不好的做法。您可能想要生成一个单独的类。

为了使 socket.write "#{message}\r\n" 调用包含更多信息,您需要覆盖 String 上的 to_s 。不过要小心!这几乎肯定会破坏事物,因为通常会在很多地方调用该方法。

我不知道您在代码中使用它做什么,所以您可能应该选择一个更好的名称,但您可以这样做:

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)

关于ruby - 在 Ruby 中序列化扩展的 String 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17685176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com