#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
Или просто проверьте, является ли ваше имя файла допустимой строкой.