3

我必须知道,如果我要从 struct (使用 .to_s)制作字符串,有什么办法可以让它返回 struct 吗?我想知道是否有一些帮助类或其他东西。

我的使用案例是在结构中保存或信息,然后通过互联网发送它并在另一端从它构建一个结构。

提前致谢。

4

2 回答 2

3

要清除上面@Semyon 给出的其他选项:

  • YAML
    可移植,但在其使用方面是特定于 Ruby 的。支持以只有 Ruby 才能真正理解的特殊方式序列化任何 Ruby 对象。如果您希望在 Ruby 之间而不是语言之间具有可移植性,那么 YAML 是要走的路:

    require 'yaml'
    obj = [1,2,3]
    YAML.dump(obj) #=> Something like "---\n- 1\n- 2\n- 3\n"
    YAML.load(YAML.dump(o)) #=> [1,2,3]
    
  • JSON
    JSON 是此类事物最广泛认可和可移植的数据标准。可在 Ruby、语言和系统之间移植。

    require 'json'
    obj = [1,2,3]
    obj.to_json #=> "[1,2,3]"
    JSON.load("[1,2,3]") #=> [1,2,3]
    

与 不同Marshal,两者都是人类可读的。

于 2013-04-04T13:56:29.897 回答
2

您从中获得的字符串struct.to_s仅用于检查。要传输您的结构,您需要在一侧对其进行序列化并从另一侧对其进行反序列化。有多种格式,包括 JSON、YAML 和 Marshal。最后一个产生非人类可读的字节流,但它是最容易使用的:

Person = Struct.new(:first_name, :last_name)
me = Person.new("Semyon", "Perepelitsa")
p data = Marshal.dump(me)
"\x04\bS:\vPerson\a:\x0Ffirst_nameI\"\vSemyon\x06:\x06ET:\x0Elast_nameI\"\x10Perepelitsa\x06;\aT"

# on the other side
p Marshal.load(data)
#<struct Person first_name="Semyon", last_name="Perepelitsa">
于 2013-04-04T12:42:01.153 回答