我想回想起案件,直到用户写下a或b。我不想使用“大小写”尤其。
我只想从用户那里获取输入,但不希望得到其他东西。如果他写其他东西,他应该写直到写a或b。
str = gets.chomp.to_s
case str
when "a"
print "nice a"
when "b"
puts "nice b"
else
puts "please do it again"
end
class person
attr_accessor :name , :surname #and other attributes
end
#There will be a method here and it will run when the program is opened.
#The method will create the first object as soon as the program is opened.
#The new object that the user will enter will actually be the 2nd object.
puts "What do you want to do?
add
list
out"
process = gets.chomp.to_s
case process
when "add"
#in here user will add new objects of my class
when "list"
#in here user will show my objects
when "out"
puts "Have a nice day"
else
puts "please do it again"
end
实际上,如果您查看它,由于用户输入正确的输入,将采取许多措施。在此示例中,我想告诉的内容更加详细。根据用户的输入,将执行诸如调用方法,添加对象等操作。
我在计算机上编写了大部分代码。但是我仍然无法解决我的第一个问题。
“我只是想做某事,直到发生其他事情为止”是当您使用某种while
循环时。
您可以这样做:
while true
str = gets.chomp
break unless str == 'a' || str == 'b'
puts "please do it again"
end
您也可以使用loop do
:
loop do
str = gets.chomp
break unless ['a', 'b'].include?(str)
puts "please do it again"
end
puts "Nice #{str}."
[Rubyist倾向于loop do
,而不是while true
。他们几乎做同样的事情。
还有一件事。有一种更简单的方法来写出字符串数组:
loop do
str = gets.chomp
break unless %w(a b).include?(str)
puts "please do it again"
end
puts "Nice #{str}."
看起来似乎并不简单,但是如果您有10个字符串,那么在不必使用所有引号的情况下键入它肯定会更快。
正如您的直觉告诉您的那样,您根本不需要使用case
语句。就像试图用大锤杀死跳蚤一样。最简洁的检查方法是检查输入字符是否包含在所需字符数组中。
有很多方法可以解决此问题,但是让我们从围绕现有代码的简单Kernel#loop包装开始,因为这可能是最简单的方法。
loop do
str = gets.chomp.to_s
case str
when "a"
print "nice a"
when "b"
puts "nice b"
else
puts "please do it again"
# restart your loop when not "a" or "b"
next
end
# exit the loop if else clause wasn't triggered
break
end
上面的循环结构非常简单,但是它需要您考虑下一步需要什么,并在流控制中使用break语句。我的直觉是简单地调用一个块,直到它成为真实的为止。例如,核心逻辑可以简化为:
str = nil; until str =~ /a|b/i do str = gets.chomp end; p str
这要短很多,但不是特别用户友好。为了在使解决方案更具通信性和抗错误性的同时利用这种方法,我将以这种方式重构原始代码:
# enable single-character input from console
require 'io/console'
# make sure you don't already have a value,
# especially in a REPL like irb
str = nil
until str =~ /a|b/ do
printf "\nLetter (a, b): "
str = STDIN.getch.downcase
end
puts "\nYou entered: #{str}"
虽然比原始代码短很多,但它处理更多的边缘情况并避免分支。对我来说,它似乎也比较整洁,但这更多是风格问题。对我来说,这种方法及其语义意图似乎也更具可读性,但是您的里程可能会合理地变化。