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

xzlaal3s  于 12个月前  发布在  Ruby
关注(0)|答案(1)|浏览(97)
def start_game
        game = true
        loop do
            print "number of chances remaining: #{@chances} \n"
            print "#{@dash.join('')} \n"
            puts "type your letters to play(or type 'save' to save the game at any point)"
            check_letter = gets.chomp.downcase
        
            if check_letter == 'save'
                save_file
            elsif @secret_word.include?(check_letter)
                array_of_guess_word =  @secret_word.split('')
                arr2 = array_of_guess_word.each_index.select {|x| array_of_guess_word[x] == check_letter}
                arr2.each do |idx|
                    @dash[idx] = check_letter 
                end
            else  
                @guessed_letter << check_letter
            end
            
            print "Letters not inlcuded: #{@guessed_letter} \n\n"
            print "Yes! the word was: #{@secret_word} \n You won congratulations #{@name}" if @dash.eql?(array_of_guess_word)
            break if @dash.eql?(array_of_guess_word)|| @chances == 0
            @chances -= 1
        end
    end

     def load_file
       if !Dir.exist?('./saved_games/')
        loop do 
         puts '\nNo saved games!'
         break if user_input == '1'
        end
       else
        loaded_game =
         File.open("./saved_games/#{load_file_name}.yml", 'r') do |file|
            YAML.load(file)
            end
            loaded_game.start_game
        end
    end

    def load_file_name
        saved_games = Dir.glob('saved_games/*').map {|game| game.split('/').last.split('.yml').first}
        file_count = saved_games.count 
        loop do 
            puts "Enter a number to load the game: "
            saved_games.each_with_index {|game , idx| puts "#{idx + 1} , #{game}"}
            file_number = gets.chomp.strip
            if /\A[0-9]+\Z/.match?(file_number) &&  file_number.to_i <= file_count
            return saved_games[file_number.to_i - 1]
            end
        puts "\nInvalid input.\n\n"
        end
    end

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

hmtdttj4

hmtdttj41#

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

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

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

def load_file
  if Dir.exist?('./saved_games/')
    file_name = "./saved_games/#{load_file_name}.yml"

    loaded_game = YAML.load_file(file_name, permitted_classes: [Hangman])
    loaded_game.start_game
  else
    loop do 
      puts "\nNo saved games!"
      break if user_input == '1'
    end
  end
end

相关问题