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

Posted

技术标签:

【中文标题】如果 Ruby 中的程序创建散列并将这些散列保存在另一个文件中,它会是啥样子?【英文标题】:What would a program in Ruby look like if it creates hashes and saves those hashes in another file?如果 Ruby 中的程序创建散列并将这些散列保存在另一个文件中,它会是什么样子? 【发布时间】:2020-05-28 01:36:40 【问题描述】:

我真的是 Ruby 编程的新手,我在互联网上找不到任何与创建哈希并将它们存储在另一个文件中的程序相关的内容。 .rb 文件的代码是什么样的?

【问题讨论】:

【参考方案1】:

通常 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 没有 symbol 数据类型(顺便说一下,YAML 有)。但它们确实包含相同的数据。


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

要使用 YAML,只需 require 'yaml' 并将前面示例中的 to_jsonJSON.parse 调用分别替换为 to_yamlYAML.load。 YAML 默认情况下非常易于阅读,我会搜索有关其语法的教程以熟悉它。

to_json 默认情况下不那么可读,因为它将所有内容都转储在同一行,但您可以改用JSON.pretty_generate(hsh),它会使事情变得更好。

【讨论】:

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

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

s=Marshal.dump(x)

创建对象的内部表示,其类型为String,并将其安全地保存到文件中。如果您稍后从文件中加载字符串并执行

x=Marshal.load(s)

您可以重新创建您的对象。我更喜欢 Max Pleaner 在他的出色回答中描述的 JSON 方法,因为(如果将其应用于哈希)它可以工作,即使哈希值是您创建的任意类的实例,其中没有提供标准格式通过 JSON。 Marshal 甚至可以保存/恢复对象的“冻结”状态,这是 JSON 无法做到的。

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

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

require 'yaml'
s = YAML.dump(x)

恢复:

x = YAML.load(s)

【讨论】:

以上是关于如果 Ruby 中的程序创建散列并将这些散列保存在另一个文件中,它会是啥样子?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据散列中的键/值查找键/值数据并将其添加到 Redis 中的散列?

在客户端散列密码是不是具有安全意义

使用 bcryptjs 将散列密码保存到数据库时出错

如何使用散列 bcrypt 版本更新数据库中的每个密码?

HashMap中的散列函数冲突解决机制和rehash

C ++中的多线程文件散列[关闭]