我是否可以记得“案件”?

问题描述 投票:0回答:2

我想回想起案件,直到用户写下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

实际上,如果您查看它,由于用户输入正确的输入,将采取许多措施。在此示例中,我想告诉的内容更加详细。根据用户的输入,将执行诸如调用方法,添加对象等操作。

我在计算机上编写了大部分代码。但是我仍然无法解决我的第一个问题。

ruby ruby-on-rails-3 switch-statement conditional-statements case
2个回答
0
投票

“我只是想做某事,直到发生其他事情为止”是当您使用某种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语句。就像试图用大锤杀死跳蚤一样。最简洁的检查方法是检查输入字符是否包含在所需字符数组中。


0
投票

使用内核#循环

有很多方法可以解决此问题,但是让我们从围绕现有代码的简单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

使用内核#until

上面的循环结构非常简单,但是它需要您考虑下一步需要什么,并在流控制中使用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}"

虽然比原始代码短很多,但它处理更多的边缘情况并避免分支。对我来说,它似乎也比较整洁,但这更多是风格问题。对我来说,这种方法及其语义意图似乎也更具可读性,但是您的里程可能会合理地变化。

另请参见

© www.soinside.com 2019 - 2024. All rights reserved.