В моей программе воспроизведения текста на базе text_base есть ошибка преобразования данных - PullRequest
0 голосов
/ 27 мая 2019

В функции read_genre, которая отображает доступный жанр в списке (в котором я определил 9 различных жанров внутри $ genre_name = [] вне функции) и предлагает пользователю выбрать жанр с помощью оператора case, а затем прочитать вномер жанра, в который пользователь ввел номер.Функция read_genre вызывается из функции read_album, а затем распечатывается в функции print_album.

Проблема заключается в том, что после запуска программы в терминале, когда я запрашиваю выбор жанра и ввел номер, я получаю ошибку'нет неявного преобразования из nil в целое число (typeError).

Я попытался изменить тип преобразования на to_i (int) и все равно получить ошибку.

module Genre
  POP, CLASSIC, JAZZ, ROCK, KPOP, METAL, PUNK, ROMANCE, LATIN = *1..9
end

$genre_names = ['Null','Pop', 'Classic', 'Jazz', 'Rock', 'KPop', 'Metal', 'Punk', 'Romance', 'Latin']

class Album
    attr_accessor :title, :artist, :genre

    def initialize (title, artist, genre)
        @title = title
        @artist = artist
        @genre = genre
    end
end

# Display the genre names in a
# numbered list and ask the user to select one
def read_genre()
    length = $genre_names.length
    index = 0
    print $genre_names
  while (index < length)
    select_genre = read_integer_in_range("Select Genre: ", 0,9)
        case select_genre
        when 1
        puts "#{index + 1} " + $genre_names[1]
        break
        when 2
        puts "#{index + 2 } " + $genre_names[2]
        break
        when 3
        puts "#{index + 3} " + $genre_names[3]
        break
        when 4
        puts "#{index + 4} " + $genre_names[4]
        break
        when 5
        puts "#{index + 5} " + $genre_names[5]
        break
        when 6
        puts "#{index + 6} " + $genre_names[6]
        break
        when 7
        puts "#{index + 7} " + $genre_names[7]
        break
        when 8
        puts "#{index + 8} " + $genre_names[8]
        break
        when 9
        puts "#{index + 9} " + $genre_names[9]
        break
         else
          puts 'Please Select again'
          break 
        end

    end

end


def read_album
  album_title = read_string("Enter Title: ")
  album_artist = read_string("Enter Artist name: ")
  album_genre = read_genre()
  album = Album.new(album_title, album_artist, album_genre)
  album
end

def print_album album
    puts ' Album information is: '
    puts "Title is #{album.title}"
    puts "Artist is #{album.artist}"
    puts 'Genre is ' + album.genre.to_s
    puts $genre_names[album.genre]

end

def read_integer_in_range(prompt, min, max)
    value = read_integer(prompt)
    while (value < min or value > max)
        puts "Please enter a value between " + min.to_s + " and " + max.to_s + ": "
        value = read_integer(prompt);
    end
    value
end

def main
  puts "Welcome to the music player"
    album = read_album()
    print_album(album)
end

main

Когда я ввел номер для конкретного жанрового индекса.например, если я ввел 2, он должен отображать Classic, потому что он находится в индексе 2 в переменной $ genre_names.

1 Ответ

0 голосов
/ 28 мая 2019

Так что я думаю, что ваша функция read_integer (prompt) должна выглядеть примерно так ...

def read_integer(prompt)
  print(prompt)
  gets.strip().to_i
end

gets.strip () -> это вернет строку, например, для."2"

"2" .to_i -> затем преобразуется из строки в целое число

Это должно вернуть целое число, после чего вы отправитесь в гонки.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...