Ruby是否有一种方法可以阻止用户在访问不同的函数/过程之前通过case调用函数/过程?



我有一个文本文件,我想首先打开它进行读取或写入,但希望用户手动输入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,如果他们在没有经过read_in_albums的情况下选择了2,他们就会得到一些类似于"未选择文件并发送回菜单屏幕的消息。

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  

并让它从read_in_albums返回true。

我不想这样做,因为它只在用户按下1时才会再次遍历read_in_albums

应用程序的所有功能都取决于专辑数据是否已被读取。毫无疑问,您将这些数据作为对象存储在内存中,并由某个变量引用。

$album_data = File.read 'album.txt'

您可以测试该数据是否存在,以确定文件数据是否已被读取:

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

不需要单独的标志。数据在内存中的存在已经作为一个标志了。

当选项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

或者只是测试你的文件名是否是一个有效的字符串。

最新更新