如何在YAML中读取ruby对象
我有一个YAML文件,如下所示:如何在YAML中读取ruby对象,ruby,yaml,Ruby,Yaml,我有一个YAML文件,如下所示: --- !ruby/object:Hi num: 1 --- !ruby/object:Hi num: 2 还有我的ruby代码: require 'yaml' class A attr_accessor :num def initialize num @num=num end end a=A.new 1 b=A.new 2 File.open 'test.yml', 'r+' do |f| f.write YAML.dump a f.write
--- !ruby/object:Hi
num: 1
--- !ruby/object:Hi
num: 2
还有我的ruby代码:
require 'yaml'
class A
attr_accessor :num
def initialize num
@num=num
end
end
a=A.new 1
b=A.new 2
File.open 'test.yml', 'r+' do |f|
f.write YAML.dump a
f.write YAML.dump b
f.seek(0)
#c=obj a
#d=ojb b
end
我想让pc和pd输出如下:
#<A:0x00000 @num=1>
#<A:0x00001 @num=2>
#
#
不是100%确定这些将以什么格式出现,但它将为您提供一个良好的开端
不是100%确定这些将以什么格式出现,但它将为您提供一个良好的起点我更愿意将对象写入单独的文件,但您的序列化方式也可以。 以下是您的案例的解决方案
RUBY_OBJECT = '--- !ruby/object:'
def load_objects(file_content)
object_contents = file_content.split(RUBY_OBJECT)
object_contents.map do |object_content|
YAML.load(RUBY_OBJECT + object_content)
end.compact
end
##########
File.open 'test.yml', 'r+' do |f|
f.write YAML.dump(a)
f.write YAML.dump(b)
f.seek(0)
file_content = f.read
c, d = *load_objects(file_content)
puts c
puts d
end
您还可以对文件内容运行regex以获取单个对象定义
如果使用一个文件进行序列化是一个严格的要求,那么可以像这样将对象数组序列化到该文件中
require 'yaml'
class A
attr_accessor :num
def initialize(num)
@num = num
end
end
a = A.new(1)
b = A.new(2)
File.open('test.yml', 'w+') do |f|
f.write YAML.dump([a, b])
end
objects = YAML.load_file('test.yml')
我更喜欢将对象写入单独的文件,但您的序列化方式也可以。 以下是您的案例的解决方案
RUBY_OBJECT = '--- !ruby/object:'
def load_objects(file_content)
object_contents = file_content.split(RUBY_OBJECT)
object_contents.map do |object_content|
YAML.load(RUBY_OBJECT + object_content)
end.compact
end
##########
File.open 'test.yml', 'r+' do |f|
f.write YAML.dump(a)
f.write YAML.dump(b)
f.seek(0)
file_content = f.read
c, d = *load_objects(file_content)
puts c
puts d
end
您还可以对文件内容运行regex以获取单个对象定义
如果使用一个文件进行序列化是一个严格的要求,那么可以像这样将对象数组序列化到该文件中
require 'yaml'
class A
attr_accessor :num
def initialize(num)
@num = num
end
end
a = A.new(1)
b = A.new(2)
File.open('test.yml', 'w+') do |f|
f.write YAML.dump([a, b])
end
objects = YAML.load_file('test.yml')
我不知道为什么某些人如此固执,以至于不能将多个YAML文档放在一个文件中,因为YAML格式是。在Ruby中,您可以使用解析多个文档,这将以数组形式返回反序列化对象:
require "yaml"
class A
attr_accessor :num
def initialize num
@num = num
end
end
a = A.new 1
b = A.new 2
File.open "test.yml", "r+" do |f|
f.write YAML.dump(a)
f.write YAML.dump(b)
f.seek(0)
c, d = YAML.load_stream(f)
p c
# => #<A:0x000055d423387cd0 @num=1>
p d
# => #<A:0x000055d423387528 @num=2>
end
您可以在repl.it上看到这两个文件的作用:我不知道为什么某些人如此坚决,以至于您不能在一个文件中放置多个YAML文档,因为YAML格式是。在Ruby中,您可以使用解析多个文档,这将以数组形式返回反序列化对象:
require "yaml"
class A
attr_accessor :num
def initialize num
@num = num
end
end
a = A.new 1
b = A.new 2
File.open "test.yml", "r+" do |f|
f.write YAML.dump(a)
f.write YAML.dump(b)
f.seek(0)
c, d = YAML.load_stream(f)
p c
# => #<A:0x000055d423387cd0 @num=1>
p d
# => #<A:0x000055d423387528 @num=2>
end
您可以在repl.it上看到这两个代码的作用:您是否尝试将其提供给
YAML.parse
或类似的程序?您在那里的代码正在生成无效的YAML。您不能只在一个文件中转储多个文档。@SergioTulentsev您绝对可以。您是否尝试过将此代码输入到YAML.parse
或类似代码?您在那里的代码正在生成无效的YAML。您不能只在一个文件中转储多个文档。@SergioTulentsev您绝对可以。JSON在这里做什么?它应该将其转换为OpenStruct可以从中创建对象的JSON?答案来自:这个答案在这里不适用,因为问题不同。仔细查看输入文件,您可能会发现一个关键的差异。@请注意,如果您从其他地方复制代码,请添加一些属性。这是使用代码形式StackOverflow时必须应用的少数要求之一。看到JSON在这里做什么了吗?它应该把它变成一个JSON,OpenStruct可以从中创建一个对象?答案来自:这个答案在这里不适用,因为问题不同。仔细查看输入文件,您可能会发现一个关键的差异。@请注意,如果您从其他地方复制代码,请添加一些属性。这是使用代码形式StackOverflow时必须应用的少数要求之一。请参阅“但是您的序列化方式也可以”-不,不可以。可以生成一个有效的yaml文件(如第二个代码段)。这样,您就不需要用额外的字符串损坏来补充YAML.load
(最好是易碎的),您永远不知道他的要求是什么。您可以将YAML.dump
的输出写入一个不应该是有效YAML文件的文件,最后它是您自己的序列化模式。您是否希望每次都将数百万个对象加载到内存中,以便能够序列化数组以生成有效的yaml文件?这就是为什么人们会说,ruby速度慢,占用大量内存。当然,将对象序列化到单独的文件中更合适,但并不总是这样!要想说“不行,不行”,你必须理解要求。看来我错了。它是一个有效的yaml文件。你活着,你学习”\_(ツ)_/’但如果不是,那么我坚持我的观点,写一个坏的格式永远都不是答案。除非你是故意这样做的,是为了与一个同样坏的系统接口。但是系统的任务是解析这个。“但如果不是这样,那么我坚持我的观点,写一个坏的格式永远都不是答案。除非你是故意这样做的,为了与一个同样坏的系统接口”。你已经知道,有些情况下,你仍然会说“决不”。你唯一能说“决不”的时候是,决不说“决不”。)但是你的序列化方式也可以“-不,不,不好。可以生成一个有效的yaml文件(如第二个代码段)。这样,您就不需要用额外的字符串损坏来补充YAML.load
(最好是易碎的),您永远不知道他的要求是什么。您可以将YAML.dump
的输出写入一个不应该是有效YAML文件的文件,最后它是您自己的序列化模式。您是否希望每次都将数百万个对象加载到内存中,以便能够序列化数组以生成有效的yaml文件?这就是为什么人们会说,ruby速度慢,占用大量内存。当然,将对象序列化到单独的文件中更合适,但并不总是这样!要想说“不行,不行”,你必须理解要求。看来我错了。它是一个有效的yaml文件。你活着,你学习”\_(ツ)_/’但如果不是,那么我坚持我的观点,写一个坏的格式永远都不是答案。除非你是故意这样做的,是为了与一个同样坏的系统接口。但是系统的任务是解析这个。“但如果不是这样,那么我坚持我的观点,写一个坏的格式永远都不是答案。除非你是故意这样做的,为了与一个同样坏的系统接口”。你已经知道,有些情况下,你仍然会说“决不”。你唯一能说“决不”的时候是,决不说“决不”。)这是一个很好的答案,我以前不知道这是可能的,非常感谢。这个答案也适用于偏执者:)我站在正确的立场。:)还有,我学到了