【问题标题】:How to permanently update a hash in Ruby?如何在 Ruby 中永久更新哈希?
【发布时间】:2016-03-07 04:10:21
【问题描述】:

所以我在这里看到了有关如何写入外部文本文件等的问题。 例如,将我的哈希写入我放置的另一个文件:

hash = {
  Key1: Value1,
  Key2: Value2
}
open(FileToWriteTo, 'w') do |f|
  hash.each { |key, value| f.puts "#{key}: #{value}" }

但我想要实现的是,如果我运行程序并向我的哈希列表添加一些内容,那么下次我运行并显示哈希时,新添加的内容就会出现。这是我用来添加到我的哈希的代码:

puts "Type 'add' to add an item to the hash"

choice = gets.chomp.downcase

case choice
when 'add'
  puts "What do you want to add?"
  addition = gets.chomp
  if hash[addition.to_sym].nil?
    puts "What value will #{addition} have? (integer)"
    add_value = gets.chomp
    hash[addition.to_sym] = add_value.to_i
      puts "#{addition} has been added with a value of #{value}."
  else
    puts "That item already exists! Its value is #{hash[addition.to_sym]}."
end

所以如果我添加项目,重新运行程序并选择显示而不是添加,我应该如何获得最后一个添加显示。谢谢。

【问题讨论】:

标签: ruby hash


【解决方案1】:

这是您可以使用的代码。它利用yaml 来存储哈希。

require 'yaml'

file = '/tmp/test.yml'
if File.exists?(file)
  hash = YAML::load_file(file)  # load yaml
else
  hash = Hash.new
end

puts "Type 'add' to add an item to the hash"
choice = gets.chomp.downcase

if choice == 'add'
  puts "What do you want to add?"
  addition = gets.chomp
  if hash[addition.to_sym].nil?
    puts "What value will #{addition} have? (integer)"
    add_value = gets.chomp
    hash[addition.to_sym] = add_value.to_i
    puts "#{addition} has been added with a value of #{add_value}."
  else
    puts "That item already exists! Its value is #    {hash[addition.to_sym]}."
  end
end

File.open(file, 'w') {|f| f.write hash.to_yaml } #store yaml

【讨论】:

  • 优秀。这正是我一直在寻找的。非常感谢! yaml 文件将包含完整的哈希,对吗?这意味着它将保存 hash = { Examplekey: Examplevalue } 并且每次都会准确加载?
  • 是的,yaml 文件包含整个哈希。每次运行代码时,哈希都会被重写到 yaml 文件中。
  • 我收到此错误:i.imgur.com/e62binv.png?..... file = 'tmp/test.yml' 是我更改的唯一行,我将其更改为该屏幕截图中显示的目录.
  • 我发现这是我的 test.yml 文件中的语法错误。它现在工作得很好。谢谢你的帮助。我还将您的文件/yaml 块改进为file = '/tmp/test.yml' hash = File.exists?(file) ? YAML::load_file(file): hash = Hash.new 感谢您的帮助!
【解决方案2】:

如果我对问题的理解正确,您希望显示添加的选项。

由于您正在使用文件并重新运行代码,因此最好在开始时读取文件(并将其存储在哈希中)并将新项目(key-val)附加到文件中。 因此,每当有人添加某些内容时,请将其附加到文件中。现在,当您在开始时再次读取文件时,它已更新。

如果这不是您的用例,请告诉我。

【讨论】:

  • 我想你已经明白了,是的。
  • 那么你就可以使用我给的解决方案了。 :)
  • 所以如果我想将一个项目添加到哈希中,请将其永久写入文件并能够在下次运行时显示它?
  • @divyum 您描述了一个可能的解决方案,但实际上并未为 OP 提供解决方案。
  • 看看this answer。使用 YAML 将允许您对文件进行序列化和反序列化。
猜你喜欢
  • 2014-01-18
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
相关资源
最近更新 更多