2015-06-08 2 views
3

Я просто даю первые шаги в программировании. Я только что закончил еще один класс в Академии Кодекса. На этот раз меня попросили создать небольшой каталог фильмов. Вот мой вопрос: как я мог сохранить/загрузить хэши с названиями фильмов и рейтингами в файле вместо собственного кода?Сохранение хэшей файлов на 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 

Как вы можете видеть, каталог входит в хэш на самого начало из код, однако он не сохраняет информацию. Как я могу сделать это хранить все?

Спасибо ребята!

ответ

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

Отличный! Это сработало для меня. Pretty easy =) Спасибо! –

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

Лучший способ по мне использует метод маршалу, как описано здесь Marshaling Модуль Marshal отвалов объект в строку, которая может быть записана в файл. Чтение файла и 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

Смежные вопросы