我只是在给我的第一步编程。我刚刚在代码学院上完另一门课。这次我被要求制作一个小电影目录。这是我的问题:我怎么能保存/加载哈希与电影标题和评级在一个文件,而不是自己的代码?
下面是代码现在的样子(葡萄牙语的几句话,但您可以忽略它:
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}