1

想象一下这样一种情况,我们所知道的关于 Ruby 对象的唯一信息是它是人类可读的格式:

#<User::Class::Element:0x2fef43 @field1 = 1, @field2 = two, @field3 = [1,2,3]>

任务是编写一个方法,该方法可以将该表示转换为该表示所指向的类的对象(当然,可以访问所有适当的命名空间、模块、类和方法)。例如:

obj = humanReadableFormat2Obj("#<User::Class::Element:0x2fef43 @field1 = 1, @field2 = \"two\", @field3 = [1,2,3]>") 
puts obj.field1      #=> "1"
puts obj.field2      #=> "two"
p obj.field3         #=> [1, 2, 3]
puts obj.class.to_s  #=> User::Class::Element

PS这个任务源于几个大型数据库的同步问题。无需以二进制格式(数百 MB)将对象从一个数据库传输到另一个数据库,您可以仅传输一个脚本(几个 KB)并在另一个数据库上执行它以创建适当的对象。

4

1 回答 1

2

OxOj gem(分别是XML 和 JSON)可以序列化为相对人类可读的 Ruby 对象。这可能是一个更好的解决方案,因为该inspect方法并不总是返回 Ruby 对象的所有属性,正如 Sigurd 在评论中提到的那样。

来自 Ox 文档的示例:

require 'ox'

class Sample
  attr_accessor :a, :b, :c

  def initialize(a, b, c)
    @a = a
    @b = b
    @c = c
  end
end

# Create Object
obj = Sample.new(1, "bee", ['x', :y, 7.0])
# Now dump the Object to an XML String.
xml = Ox.dump(obj)
# Convert the object back into a Sample Object.
obj2 = Ox.parse_obj(xml)
于 2012-12-11T16:02:34.797 回答