Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在YAML中读取ruby对象_Ruby_Yaml - Fatal编程技术网

如何在YAML中读取ruby对象

如何在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

我有一个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 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文件。你活着,你学习”\_(ツ)_/’但如果不是,那么我坚持我的观点,写一个坏的格式永远都不是答案。除非你是故意这样做的,是为了与一个同样坏的系统接口。但是系统的任务是解析这个。“但如果不是这样,那么我坚持我的观点,写一个坏的格式永远都不是答案。除非你是故意这样做的,为了与一个同样坏的系统接口”。你已经知道,有些情况下,你仍然会说“决不”。你唯一能说“决不”的时候是,决不说“决不”。)这是一个很好的答案,我以前不知道这是可能的,非常感谢。这个答案也适用于偏执者:)我站在正确的立场。:)还有,我学到了