将哈希输出到文本文件

时间:2015-11-04 19:45:58

标签: ruby

我无法将哈希的内容输出到文件中。该程序管理学生记录列表,包括学生ID,名字,姓氏,专业和目录年份。用户完成添加记录后,会将其添加到哈希中。

程序中的所有内容都能正常运行,除非我尝试运行quit_program函数,它不会将内容保存在文件中。另外,我没有收到任何错误,任何想法?

它是否可能无法正常工作,因为它将我的哈希值中的文本(字母数字)转换为文本文件时遇到了问题?

def quit_program()

puts "Save Changes? y/n"

@changes = gets().chomp

if @changes=="y"


    @fh=File.open(@file_name, 'w')
    @this_string=""

    @sDB.each do |key, store_account_data| #line 50

    puts "#{key}: #{store_account_data.join(',')}"
    end
    end 

@fh.puts(@this_string)
@fh.close()     

end 

4 个答案:

答案 0 :(得分:1)

你没有在文件中写任何东西。字符串@this_string为空。你应该做

@sDB.each do |key, store_account_data|
  @fh.puts "#{key}: #{store_account_data.join(',')}"
end

答案 1 :(得分:1)

答案在错误消息中给出:undefined local variable or method 'sDB'(您已将其从问题中移除,使编辑后的版本无法回答。)您的计划中定义sDB的位置和时间?您显然是在初始化之前尝试退出。

在任何情况下,直接在其他方法中访问实例变量并不是一件好事。您应该使用访问器(getter和setter)方法。这可能会阻止这种情况首先咬你。

def sdb
  @sDB ||= Hash.new
end

def sdb=( key, value )
  sdb
  @sDB[ key ] = value
end
. . .

即使定义了@sDB,您也无法正确写入文件。有关示例,请参阅Ruby - Printing a hash to txt file

答案 2 :(得分:1)

  

它不会将内容保存在文件中。

以下不是您如何写入文件:

puts "#{key}: #{store_account_data.join(',')}"

这就是你写到终端/控制台窗口的方式。

这段代码:

    @this_string=""

@fh.puts(@this_string)

将空白字符串写入文件。

以下是您写入文件的方式:

class Student

  def initialize(sDB, filename)
    @sDB = sDB
    @filename = filename
  end

  def save_changes()
    puts "Save Changes? y/n"
    user_answer = gets().chomp

    if user_answer == "y"

      File.open(@file_name, 'w') do |f|
        @sDB.each do |key, store_account_data| #line 50
          f.puts "#{key}: #{store_account_data.join(',')}"
        end
      end

    end 

end 
  

它可能无法正常工作,因为它遇到了麻烦   将我的哈希值中的文本(字母数字)转换为文本   文件?

没有。以下是您可以尝试的具体示例:

data = {
  "John" => ['a', 123, 'b', 456],
  "Sally" => ['c', 789, 'b', 0]
}

File.open('data.txt', 'w') do |f|
  data.each do |name, data|
    f.puts "#{name}: #{data.join(',')}"
  end
end

$ ruby myprog.rb 
$ cat data.txt
John: a,123,b,456
Sally: c,789,b,0

此外,ruby缩进是2个空格 - 不是0个空格或3个空格,或其他任何东西。

答案 3 :(得分:1)

您的问题缺少必要的输入数据,因此无法测试我们建议的更改。

此处未经测试的代码我来自:

def quit_program
  puts "Save Changes? y/n"
  if gets.chomp.downcase == 'y'
    File.write(
      @file_name,
      @s_db.map{ |k, v| "#{ k }: #{ v.join(',') }" }.join("\n")
    )
  end 
end 

注意:

  • @sDB在Ruby中不是一个正确的变量名。我们使用snake_case而不是camelCase作为变量和方法名称。 ItsAMatterOfReadability。在第一次进行代码审查时,遵循惯例或遭受团队成员的愤怒。
  • 不要在方法名称(quit_program())或调用(gets())中添加空括号,除非它必须告诉变量和方法调用之间的区别。您也不应该将变量命名为与方法相同的名称,因为它会使每个处理代码的人感到困惑,因此永远不应该考虑这一点。
  • 不要创建一个你使用过的变量(@changes)而扔掉,除非你所做的事情如此复杂,你需要将操作细分为更小的块。并且,如果您正在这样做,那么它将成为重构为单独方法的非常好的候选者,所以再一次,不要这样做。
  • 将用户输入与您期望的内容进行比较时,请将输入的大小写折叠起来以符合您的预期。 (gets.chomp.downcase == 'y')。这真的激怒了用户进入" y"因为你坚持" Y"。
  • 而失败
  • 可以使用File.open创建或写入文件时,使用File.write的视觉噪音较少。当您需要为模式使用各种选项时open非常棒,但纯文本write就足够了。
  • 用于写入的整个块看起来可以清理为单个mapjoin,它将数据强制转换为字符串数组,然后转换为单个字符串。