Я сталкиваюсь с ошибкой 'split' для nil:NilClass в ruby, хотя он просто работал

Я работал над кодом, который мне довольно трудно понять, а потом из-за того, где появилась эта ошибка, говоря:

in `process_data': undefined method `split' for nil:NilClass (NoMethodError)

Поэтому я отменил сделанные мной изменения, и они появлялись снова и снова, и я не имею ни малейшего понятия о том, что их вызвало?
Код

class HiScore
    attr_reader :hiscore

    def initialize
        @hiscore = if File.exist?('hiscore.txt')
            read_file
        else
            build_new
        end
    end

    def show
        puts "Top 5 Scores"
        @hiscore.each do |r|
          puts r.each { |p| p }.join(" ")
        end
    end

    def build_new
        Array.new(5) {[1000, '--']}
        write_file()
    end

    def read_file()
        puts "read_file"
        #File.open('hiscore.txt', 'r') #{|f| f.each_line.map{|l| l.chomp!.split(',')}}\
        @hiscore = File.read("hiscore.txt").chomp!
        process_data(@hiscore)
    end

    def process_data(instance)
        @hiscore = @hiscore.split(",").to_a
        @hiscore = @hiscore.each_slice(2).to_a
    end

    def check(score)
        @hiscore.sort!{|s1, s2| s1[0] <=> s2[0]}
        max = @hiscore[4][0].to_i
        if score > max
            puts "Sorry no top score for you."
        else
            add_name(@score.to_s)
            # @hiscore.each do |row|
              # p row[0] do |column|
                  # puts column[0].to_i  
              # end
            # end
        end
    end

    def add_name(score)
        puts "You made it into the Top 5!"
        print "Enter your name: "
        @name = gets.chomp!.to_s
        @hiscore.push([score, @name]).sort!{|s1, s2| s1[0] <=> s2[0]}.pop
        #@hiscore = @scoreList
        #@hiscore = @scoreList
        write_file()

    end

    def write_file()
        File.open('hiscore.txt', 'w') do |f|
        @hiscore.each {|array| f.puts array.join(',')}
            #print "#{@hiscore}"
        end
    end

end

def start
    play = true
    while play == true
        num_guesses = 0
        answer = rand(1..1000)
        puts answer

        @game.show

        loop do
            print "Type in your guess: "
            guess = gets.chomp.to_i

            num_guesses += 1 
            unless guess == answer 
                message = if guess > answer 
                    "Too high"
                else
                    "Too low"
                end
                puts message 
            else
                puts "You got it!"
                puts "It took you #{num_guesses} guesses."
                @score = num_guesses
                @game.check(@score)

                break
            end
        end
        print "Would you like to play again? (y/n): "
        again = gets.chomp!
        if again == 'n'
            play = false
            puts "Ok, Bye!"
            exit
        elsif again == 'y'
            play = true
        end
    end
end

puts "I'm thinking of a random number from 1 to 1000"
puts "Can you guess it?"
@game = HiScore.new()
start()

Может кто-нибудь помочь с этим?

2 ответа

Решение

Непосредственной причиной ошибки является то, что @hiscore переменная nil в process_data метод при попытке быть split -ed.

Я думаю, что основной ошибкой может быть следующая строка в read_file метод:

@hiscore = File.read("hiscore.txt").chomp!

Согласно документации, chomp! метод возвращает nil когда он не вносит изменений в строку, т. е. когда он не удаляет символы новой строки с конца строки. Вы, вероятно, хотите использовать chomp вместо этого, который просто возвращает исходную строку, если в конце нет новой строки.

Он также может выдать ошибку, если "hiscore.txt" имеет значения, уже разделенные запятой, и вы пытаетесь разделить его снова с разделителем ",".

"@hiscore" является переменной экземпляра функции read_file, поэтому область действия будет ограничена самой этой функцией. В функции "process_data (instance)", если вы используете экземпляр вместо "@hiscore" и эта переменная имеет правильные данные, тогда она будет обрабатываться правильно.

Другие вопросы по тегам