Ruby есть ли способ запретить пользователю вызывать функцию/процедуру через регистр до того, как он получит доступ к другой функции/процедуре?

#ruby #function #file #case #procedure

Вопрос:

У меня есть текстовый файл, который я хочу сначала открыть для чтения или записи, но хочу, чтобы пользователь сначала вручную ввел имя text_file (которое открывает файл для чтения), вот так:

 def read_in_albums
    puts "Enter file name: "
    
    begin
        file_name = gets().chomp
        if (file_name == "albums.txt")
            puts "File is open"
            a_file = File.new("#{file_name}", "r")
            puts a_file.gets
            finished = true
        else 
            puts "Please re-enter file name: "  
        end
    end until finished
end
 

Из этого незавершенного кода ниже, выбрав 1, вы перейдете к описанной выше процедуре. Я хочу, чтобы пользователь сначала выбрал 1, и если он выберет 2, не пройдя через read_in_albums, он просто получит какое-то сообщение типа «файл не выбран и отправлен обратно на экран меню.

 def main()
  finished = false
  begin
    puts("Main Menu:")
    puts("1- Read in Album") 
    puts("2- Display Album Info")
    puts("3- Play Album")
    puts("4- Update Album")
    puts("5- Exit")
    
    choice = read_integer_in_range("Please enter your choice:", 1, 5)
    case choice
    when 1
      read_in_albums
    when 2
      display_album_info  
    when 5
      finished = true
    end
  end until finished
end
    
main()
 

Единственное, что я могу придумать, это что-то вроде

 when 2
        if(read_in_albums == true)
            display_album_info  
 

и пусть он вернет значение true из read_in_albums.

чего я не хочу делать, так как он просто снова проходит через read_in_albums, когда я хочу, чтобы он делал это только в том случае, если пользователь нажал 1.

Комментарии:

1. Я этого не понимаю. Вы спрашиваете у пользователя имя файла альбома, но код будет работать только в том случае, если album.txt он введен. Почему?

Ответ №1:

Вся функциональность вашего приложения зависит от того, были ли прочитаны данные альбома. Вы, без сомнения, храните эти данные как объект в памяти, на который ссылается какая-либо переменная.

 $album_data = File.read 'album.txt'
 

Вы можете проверить, присутствуют ли эти данные, чтобы определить, были ли прочитаны данные файла:

 if $album_data.nil?
  # ask user for album file
else
  # show album user interface
end
 

Нет необходимости в отдельном флаге. Само наличие данных в памяти уже служит флагом.

Ответ №2:

Вы можете либо установить флаг, когда был выбран вариант 1

 has_been_read = false
...
when 1 
    read_in_albums
    has_been_read = true
when 2
    if has_been_read
        display_album_info
    else
        puts "Select Option 1 first"
    end
 

Или просто проверьте, является ли ваше имя файла допустимой строкой.