如果Ruby中的程序创建散列并将这些散列保存在另一个文件中,它会是什么样子?

如果Ruby中的程序创建散列并将这些散列保存在另一个文件中,它会是什么样子?,ruby,save,Ruby,Save,我对Ruby编程非常陌生,在互联网上找不到任何与创建哈希并将其存储在另一个文件中的程序相关的东西。一个.rb文件的代码看起来像什么?通常Ruby哈希不会直接写入文件。我们使用JSON或YAML等序列化格式,以便该文件可以被Ruby之外的其他编程语言和工具读取 让我们以JSON为例,因为它是最常见的。我们可以轻松地读取/写入JSON require 'json' path = "path.json" hsh = { a: 1, b: 2 } # Write to the file File.

我对Ruby编程非常陌生,在互联网上找不到任何与创建哈希并将其存储在另一个文件中的程序相关的东西。一个.rb文件的代码看起来像什么?

通常Ruby哈希不会直接写入文件。我们使用JSON或YAML等序列化格式,以便该文件可以被Ruby之外的其他编程语言和工具读取

让我们以JSON为例,因为它是最常见的。我们可以轻松地读取/写入JSON

require 'json'

path = "path.json"
hsh = { a: 1, b: 2 }

# Write to the file

File.open(path, "w") do |file|
  file.write hsh.to_json
end

# Read from the file

hsh2 = JSON.parse(File.read(path))

# let's print them out for inspection

print hsh
# => {:a=>1, :b=>2}

print hsh2
# => {"a"=>1, "b"=>2}
正如您所看到的,哈希在技术上是不同的,这是因为JSON没有符号数据类型(顺便说一下,YAML有)。但它们确实包含相同的数据


请注意,在这里回应您对目标的评论。您需要的是一种人类可读的数据序列化格式,幸运的是,JSON和YAML都是人类可读的,并且一直用于此目的

要使用YAML,只需
要求使用“YAML”
并将上一示例中的
To_json
json.parse
调用分别替换为
To_YAML
YAML.load
。默认情况下,YAML非常易于阅读,我会搜索有关其语法的教程来熟悉它


默认情况下,
to_json
的可读性不高,因为它会将所有内容转储到同一行,但您可以使用
json.pretty_generate(hsh)
,它会让事情变得更好

对于几乎任何对象x,但肯定包括散列,您可以使用

s=Marshal.dump(x)
创建对象的内部表示,该对象的类型为
字符串
,并将其安全保存到文件中。如果以后从文件中加载字符串并执行

x=Marshal.load(s)
您可以重新创建对象。与Max Pleaner在其出色的回答中描述的JSON方法相比,我更喜欢这种方法,因为(如果您将其应用于哈希),即使哈希值是您创建的任意类的实例,JSON也不提供标准格式,这种方法仍然有效。Marshal甚至保存/恢复对象的“冻结”状态,这是JSON无法做到的

另一方面,Marshal的缺点是需要使用Ruby程序重新创建数据,而JSON是一种标准格式,可以由其他应用程序处理。更重要的是,封送格式不能保证在不同的主要Ruby版本之间兼容,所以如果这是一个问题,不要使用它

另一种传输格式是YAML;这一概念与Marshal相同,但速度稍慢,与JSON一样,它不适用于散列中的任意类型,除非您自己提供合适的传输方法。与JSON一样,YAML可以从其他应用程序读取,对于人类来说,我发现它比JSON更容易读取:

require 'yaml'
s = YAML.dump(x)
恢复为:

x = YAML.load(s)

我指的是一个界面,在该界面中,使用该文件的人可以为哈希列表填写数据。我的目标是制作一个程序,让人们用书名、流派和作者等信息填写他们所拥有的书籍的信息。@Noodle54编辑答案,这就是您要查找的信息吗?您可以使用
来创建一个初始文件结构,然后将其传递给其他人进行手动编辑,YAML和JSON都支持嵌套数组/散列/etc,因此您可以随意使用更复杂的数据结构。这正是我想要的。我想我可以自己处理程序用户输入,因为我的目标是让程序的用户在程序中创建一个散列。