有没有办法以字符串形式从struct创建Ruby Struct?

时间:2013-04-04 12:12:40

标签: ruby string struct

我必须知道,如果我将从struct(使用.to_s)创建字符串,是否有任何方法可以使它返回结构?我想知道是否有一些辅助课或其他什么。

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

清除以上@Semyon提供的其他选项:

  • YAML
    便携式,但使用Ruby特定。支持以只有Ruby才能真正理解的特殊方式序列化任何Ruby对象。如果你想在Rubies之间移植而不是语言,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是最广泛认可的便携式数据标准。可以在Rubies,语言和系统之间移植。

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

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

答案 1 :(得分: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">