2015-06-08 36 views
3

我只是在編程的第一步。我剛剛在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 

正如你所看到的,目錄在的beggining列入哈希代碼但它不保存的信息。我怎樣才能使它保存一切?

謝謝你們!

回答

5

如果他們是簡單的哈希,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 
+0

優秀!它爲我工作。很容易=) 謝謝! –

0

您可以根據我簡單地使用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} 
0

的最佳方法是使用Marshal方法,如下Marshaling 解釋元帥模塊轉儲一個字符串的對象,它可以被寫入一份文件。讀取文件和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它也被人們使用了很多來實現。

在這裏也可以得到類似的解釋。 Closest match I found