gpt4 book ai didi

ruby - 循环多个条件直到全部满足

转载 作者:太空宇宙 更新时间:2023-11-03 17:43:47 24 4
gpt4 key购买 nike

我正在使用 Ruby 从用户那里获取输入,以便为文件列表提供新名称。我将名称存储在一个数组中,但在存储它之前,我有一系列循环条件,以确保用户的输入有效。它基本上归结为这个(我删除了与问题无关的部分代码):

puts "Rename file to:"
new_name = gets.chomp
new_name = check_input(new_name,@all_names)
@all_names << new_name

def check_input(new_name,all_names)

while new_name.match(/\s/)
puts "Names must not contain spaces:"
new_name = gets.chomp
end

while new_name.empty?
puts "Please enter a name:"
new_name = gets.chomp
end

while all_names.include? new_name
puts "That name already exists. Please enter a different name:"
new_name = gets.chomp
end

return new_name

end

总的来说这工作得很好,但我想确保一次又一次地循环每个“while”条件,直到满足所有条件。例如,如果名称“abc”已经存在,则用户遵循以下顺序:

  1. enters "abc"=> "该名称已存在。请输入不同的名称姓名”
  2. 输入“a b c”=>“名称不能包含空格”
  3. 再次输入“abc”=>

最后一个条目成功运行,但我不希望它成功,因为它跳过了检查重复项的条件。对于每个新条目,是否有更好的方法同时循环这些条件?

感谢您的帮助!

最佳答案

循环的正确想法,只是错误的地方。您需要根据所有可能的无效情况检查用户的每个 gets。您正在做的是检查直到一个无效案例通过,然后继续进行另一个案例,它不检查以前的案例是否仍然通过:

# outputs an error message and returns nil if the input is not valid.
# Otherwise returns the input
def check_input(input, all_names)
if input.match(/\s/)
puts "Name must not contain spaces:"
elsif input.empty?
puts "Please enter a name:"
elsif all_names.include?(input)
puts "That name already exists. Please enter a different name:"
else
input
end
end

@all_names = ['abc']
puts "Rename file to:"
# keep gets-ing input from the user until the input is valid
name = check_input(gets.chomp, @all_names) until name
@all_names << name
puts @all_names.inspect

由于 puts 返回 nil,如果输入无效,check_input 将返回 nil。否则,在最后的 else 中,我们将返回有效输入并将其分配给变量 name 并停止执行 until 循环。

运行示例:

Rename file to:
abc
That name already exists. Please enter a different name:
a b c
Name must not contain spaces:
abc
That name already exists. Please enter a different name:
abc23
["abc", "abc23"]

关于ruby - 循环多个条件直到全部满足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46103144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com