在Ruby上保存哈希到文件



我只是在给我的第一步编程。我刚刚在代码学院上完另一门课。这次我被要求制作一个小电影目录。这是我的问题:我怎么能保存/加载哈希与电影标题和评级在一个文件,而不是自己的代码?

下面是代码现在的样子(葡萄牙语的几句话,但您可以忽略它:

    movies = {
    Memento: 3,
    Primer: 4,
    Ishtar: 1
    }
    puts "O que você gostaria de fazer?"
    puts "-- Digite 'add' para adicionar um filme."
    puts "-- Digite 'update' para atualizar um filme."
    puts "-- Digite 'display' para mostrar todos os filmes."
    puts "-- Digite 'delete' para deletar um filme."
    choice = gets.chomp.downcase
    case choice
    when 'add'
      puts "Que filme você gostaria de adicionar?"
      title = gets.chomp
      if movies[title.to_sym].nil?
        puts "Qual a nota? (Digite um número de 0 a 4.)"
        rating = gets.chomp
        movies[title.to_sym] = rating.to_i
        puts "#{title} foi adicionado com uma nota de #{rating}."
      else
        puts "Esse filme já existe na lista! Sua nota é #                        {movies[title.to_sym]}."
      end
    when 'update'
      puts "Que filme você gostaria de atualizar?"
      title = gets.chomp
      if movies[title.to_sym].nil?
        puts "Filme não encontrado!"
      else
        puts "Qual é a nova nota? (Digite um número de 0 a 4.)"
        rating = gets.chomp
        movies[title.to_sym] = rating.to_i
        puts "#{title} foi atualizado, sua nova nota é #{rating}."
      end
    when 'display'
      movies.each do |movie, rating|
        puts "#{movie}: #{rating}"
      end
    when 'delete'
      puts "Que filme voce gostaria de deletar?"
      title = gets.chomp
      if movies[title.to_sym].nil?
        puts "Filme não encontrado!"
      else
        movies.delete(title.to_sym)
        puts "#{title} foi deletado."
      end
    else
      puts "Desculpa, não entendo o que você quer."
    end

可以看到,目录包含在代码开头的散列中,但是它不保存信息。我怎么能让它存储所有东西?

谢谢大家!

如果它们是简单的散列,则使用YAML文件可能是一种简单的方法。

require 'yaml'
# write hash out as a YAML file
movies = { Memento: 1, Primer: 4, Ishtar: 1 }
File.write('movies.yml', movies.to_yaml)
# read back in from file
from_file = YAML.load_file('movies.yml')
# use it
from_file[:Memento]
# => 1 
from_file[:Primer]
# => 4 

我认为最好的方法是使用Marshal方法,这里解释了MarshalingMarshal模块将对象转储为字符串,该字符串可以写入文件。读取文件并对字符串进行Marshal.Load处理,得到原始对象。写入文件可以使用Marshal.dump

实现例如,在您的代码中,这可以使用 来实现。
movies = {
Memento: 3,
Primer: 4,
Ishtar: 1
}
# dumping:
File.open("test.marshal", "w"){|to_file| Marshal.dump(movies, to_file)}
# retrieving:
p File.open("test.marshal", "r"){|from_file| Marshal.load(from_file)}
#gives you movies = {Memento: 3,Primer: 4,Ishtar: 1}

另一种方法是由@Nick Veys使用Yaml解释的,它也被人们大量使用。

在这里也可以得到类似的解释。最接近的匹配

您可以简单地使用JSON,像这样

require 'json'
FILE_PATH = "catalogue.json"
def load
  data = nil
  File.open(FILE_PATH) do |f|
    data = JSON.parse(f.read)
  end
  data
end
def save(data)
  File.open(FILE_PATH, "w+") do |f|
    f << data.to_json
  end
end
def process
  catalogue = load
  p catalogue
  catalogue["Memento"] = 4
  save(catalogue)
end
process
# => {"Memento"=>3, "Primer"=>4, "Ishtar"=>1}
catalogue = load
p catalogue
# {"Memento"=>4, "Primer"=>4, "Ishtar"=>1}

相关内容

  • 没有找到相关文章

最新更新