将哈希值保存到Ruby上

我只是在编程方面迈出了第一步。 我刚刚在Code Academy完成了另一堂课。 这次我被要求创建一个小电影目录。 这是我的问题:如何在文件而不是自己的代码中保存/加载带有电影标题和评级的哈希?

以下是代码现在的样子(用葡萄牙语写几句,但你可能会忽略它:

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 

你可以简单地使用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} 

根据我的最佳方法是使用Marshal方法,如此处所述.Marshaling Marshal模块将一个对象转储到一个字符串中,该字符串可以写入文件。 读取文件和Marshal.Load ing字符串给出原始对象。 使用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解释了另一种方法,人们也经常使用它。

这里也可以获得类似的解释。 我发现最接近的比赛