Ruby 程序不保存哈希更改

Posted

技术标签:

【中文标题】Ruby 程序不保存哈希更改【英文标题】:Ruby program doesn't save hash changes 【发布时间】:2014-04-08 06:25:23 【问题描述】:

我的源代码:

books = 
    Harry_Potter: 5,
    Steve_Jobs: 10


def finder(bookName)
    books.each 
            |n| if n == bookName
                puts "Are you sure you want to #choice #n?"
                confirmAction = gets.chomp
                    if confirmAction == "yes" 
                    case choice
                        when "update"
                            puts "Enter the new name:"
                            newName = gets.chomp.to_sym
                            books[newName.to_sym] = books.delete(n)
                            puts "Update the rating for #newName:"
                            newRating = gets.chomp.to_i
                            books[newName.to_sym] = newRating.to_i
                            puts "Successfully updated #newName with rating of #newRating"

                        when "delete"
                            books.delete(n)

                        else puts "Invalid option!"
                    end

                else puts "Invalid book name."
                end
            end

            
end


puts "What would you like to do?\n[Add] [Update] [Delete] [View]"
action = gets.chomp.capitalize

case action
    when "Add"
        puts "Enter the new book name:"
        title = gets.chomp.to_sym
        puts "Please rate the book [1-10]:"
        rating = gets.chomp.to_i
        books[title.to_sym] = rating.to_i
        puts "Successfully added #title with rating of #rating"
        puts books

    when "Update"
        choice = "update"
        puts "Enter the name of the book:"
        bookName = gets.chomp.to_sym
        finder(bookName)

    when "Delete"
        choice = "delete"
        puts "Enter the name of the book:"
        bookName = gets.chomp.to_sym
        finder(bookName)

    when "View"
        choice = "view"
        puts books.each 
            |k, v| puts "#k: #v"
        
    end

每当我使用 add 选项并添加一些东西时,它都会起作用。但是一旦我退出并重新打开程序,它就不会显示我使用 add 选项添加的书籍,它会返回到默认列表。 我需要 Ruby 永久保存所有更改。

【问题讨论】:

旁注,Ruby 的惯例是使用 2 空格而不是 4 空格缩进。 永久?然后你应该有一个像数据库或文件输出这样的存储。 我没有看到任何内容被写入文件。这是您保存更改的唯一方法。 @Cupcake 谢谢! :) @Santosh 我以为 Ruby 会在文件中写入列表,但无论如何感谢您清除我的疑问。 【参考方案1】:

您必须自己保存对象,例如使用YAML:

require 'yaml'
File.write('data.yml', YAML.dump(books))

“data.yml”的内容是:

---
:Harry_Potter: 5
:Steve_Jobs: 10

要读取文件,请使用:

books = YAML.load(File.read('data.yml'))
#=> :Harry_Potter=>5, :Steve_Jobs=>10

【讨论】:

【参考方案2】:

好吧,您可以使用Maglev,它是一个基于GemStone/S Object Server 的ruby 解释器,它将能够持久地存储您的书籍(通过设置对您的books Hash 和Maglev.commit_transaction 的引用)。但是,对于您的目的而言,这可能有点矫枉过正:-)

【讨论】:

以上是关于Ruby 程序不保存哈希更改的主要内容,如果未能解决你的问题,请参考以下文章

Ruby更改哈希的键值

Ruby JSON 解析更改哈希键

关闭应用程序后,哈希图中的数据不保存

将哈希值保存到 Ruby 上的文件

在更改 ruby​​ 中的某些值后,如何维护具有原始值的哈希副本?

ruby 将Ruby对象转换为哈希。这不是用于对象序列化或映射,而是用于保存包含的信息