我无法反序列化我写给YAML的ruby类。
我想成为的地方
我希望能够将一个对象作为一个完整的“问题”传递,其中包括问题文本,一些可能的答案(对于多选。)和正确答案。一个模块(编码器)接收输入,从中构建一个“问题”类并将其附加到问题池。另一个模块读取问题池并构建一个“问题”对象数组。
我目前的位置
示例问题库
--- |
--- !ruby/object:MultiQ
a: "no"
answer: "no"
b: "no"
c: "no"
d: "no"
text: "yes?"
编码器转储到YAML文件。对象是一个填充输入的MultiQ。 (见下文。)
def dump(file, object)
File.open(file, 'a') do |out|
YAML.dump(object.to_yaml, out)
end
object = nil
end
MultiQ类定义
class MultiQ
attr_accessor :text, :answer, :a, :b, :c, :d
def initialize(text, answer, a, b, c, d)
@text = text
@answer = answer
@a = a
@b = b
@c = c
@d = d
end
end
解码器(我一直在尝试不同的东西,所以这里不是我的第一个或最好的猜测。但是我很茫然,文档并没有真正解释得太彻底。)
File.open( "test_set.yaml" ) do |yf|
YAML.load_documents( yf ) { |item|
new = YAML.object_maker( MultiQ, item)
puts new
}
end
您可以回答的问题
答案 0 :(得分:3)
当您写入yaml时,您不需要先调用to_yaml,只需将对象本身传递给YAML.dump(object)
这可能会导致你遇到其他问题,因为to_yaml的输出是一个字符串..而YAML.dump实际上将你的对象作为字符串写入文件(这就是为什么你有一个初始的“ - |”行。加载该文件的任何代码都会将该数据作为字符串加载。
像这样加载一个对象:
File.open( 'test_set.yaml', 'r') { |fh| mq_loaded = YAML.load( fh ) }
您使用的“新”通常会令人困惑,因为new是关键字。