ruby t显示我的Psych::DisallowedClass当我尝试验证yaml文件

xzlaal3s  于 2023-10-17  发布在  Ruby
关注(0)|答案(1)|浏览(156)
  1. def start_game
  2. game = true
  3. loop do
  4. print "number of chances remaining: #{@chances} \n"
  5. print "#{@dash.join('')} \n"
  6. puts "type your letters to play(or type 'save' to save the game at any point)"
  7. check_letter = gets.chomp.downcase
  8. if check_letter == 'save'
  9. save_file
  10. elsif @secret_word.include?(check_letter)
  11. array_of_guess_word = @secret_word.split('')
  12. arr2 = array_of_guess_word.each_index.select {|x| array_of_guess_word[x] == check_letter}
  13. arr2.each do |idx|
  14. @dash[idx] = check_letter
  15. end
  16. else
  17. @guessed_letter << check_letter
  18. end
  19. print "Letters not inlcuded: #{@guessed_letter} \n\n"
  20. print "Yes! the word was: #{@secret_word} \n You won congratulations #{@name}" if @dash.eql?(array_of_guess_word)
  21. break if @dash.eql?(array_of_guess_word)|| @chances == 0
  22. @chances -= 1
  23. end
  24. end
  25. def load_file
  26. if !Dir.exist?('./saved_games/')
  27. loop do
  28. puts '\nNo saved games!'
  29. break if user_input == '1'
  30. end
  31. else
  32. loaded_game =
  33. File.open("./saved_games/#{load_file_name}.yml", 'r') do |file|
  34. YAML.load(file)
  35. end
  36. loaded_game.start_game
  37. end
  38. end
  39. def load_file_name
  40. saved_games = Dir.glob('saved_games/*').map {|game| game.split('/').last.split('.yml').first}
  41. file_count = saved_games.count
  42. loop do
  43. puts "Enter a number to load the game: "
  44. saved_games.each_with_index {|game , idx| puts "#{idx + 1} , #{game}"}
  45. file_number = gets.chomp.strip
  46. if /\A[0-9]+\Z/.match?(file_number) && file_number.to_i <= file_count
  47. return saved_games[file_number.to_i - 1]
  48. end
  49. puts "\nInvalid input.\n\n"
  50. end
  51. end

当我试图加载文件时,我得到这个错误,说psych::DisallowedClass。我就是不能把我的yaml代码
我想知道我到底哪里做错了。我想这是因为我在代码中使用的示例变量。我是序列化新手

hmtdttj4

hmtdttj41#

默认情况下,出于安全原因,Psych(Ruby用来处理YAML的库)只允许有限的类列表(TrueClassFalseClassNilClassIntegerFloatStringArrayHash)被解析。
当你想允许其他类(比如你的例子中的自定义Hangman类)从你的YAML文件中被格式化时,你必须显式地允许这些类:

  1. YAML.load_file(file_name, permitted_classes: [Hangman])

我建议像这样修改load_file方法:

  1. def load_file
  2. if Dir.exist?('./saved_games/')
  3. file_name = "./saved_games/#{load_file_name}.yml"
  4. loaded_game = YAML.load_file(file_name, permitted_classes: [Hangman])
  5. loaded_game.start_game
  6. else
  7. loop do
  8. puts "\nNo saved games!"
  9. break if user_input == '1'
  10. end
  11. end
  12. end
展开查看全部

相关问题