我无法将哈希的内容输出到文件中。该程序管理学生记录列表,包括学生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
答案 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
就足够了。map
和join
,它将数据强制转换为字符串数组,然后转换为单个字符串。