循环遍历Ruby中的case语句?

时间:2014-03-17 16:11:25

标签: ruby

我正在尝试确定循环case语句的最佳方法,直到用户提供某个输入(在本例中为exit)。

到目前为止,我的代码使用了while循环,但是当我input = gets.chomp一遍又一遍时,它似乎有点多余。

这是一些缩写代码:

input = gets.chomp

while input.downcase != 'exit'
  case input.downcase
    when 'help'
      puts "Available commands are..."
      input = gets.chomp

    #more when statements go here...

    else 
      puts "That is not a valid command. Type 'HELP' for available commands."
      input = gets.chomp
  end
end

puts "Goodbye!"

3 个答案:

答案 0 :(得分:3)

我会这样写:

loop do

  input = gets.chomp.downcase

  case input
  when 'help'
    puts "Available commands are..."

    # more when statements go here...
  when 'exit'
    break

  else
    puts "That is not a valid command. Type 'HELP' for available commands."
  end

end

puts "Goodbye!"

loop是针对这种情况而设计的,你只想干净地循环,然后最终在某种情况下爆发。

为了最清楚地了解代码的作用,我会在读取输入后立即放置exit,而不是嵌入case语句中。这是一个小问题,但是如果你正在编码而其他人必须帮助维护它,那么它是有用的:

loop do

  input = gets.chomp.downcase
  break if input == 'exit'

  case input
  when 'help'
    puts "Available commands are..."

    # more when statements go here...

  else
    puts "That is not a valid command. Type 'HELP' for available commands."
  end

end

puts "Goodbye!"

答案 1 :(得分:2)

为什么不将while更改为:

while (input = gets.chomp.downcase) != 'exit'

请注意,这也意味着您可以使用case input.downcase而不是case input,因为它已经被设为小写。

编辑:我在C的根源背叛了我......

正如评论中所提到的,这不是一个特别“红宝石式”的解决方案。当gets返回nil时,它还会导致堆栈跟踪。您可能更喜欢将其拆分为两行:

while (input = gets)
  input = input.chomp.downcase
  break if input == 'exit'

  case input

  # when statements

  else
    puts "That is not a valid command. Type 'HELP' for available commands."
  end
end

由于以下几个原因,我将“退出”与case条件分开:

  1. 这是问题中循环逻辑的一部分,所以它(可以说)更具可读性,使其与其他案例分开。
  2. 我没有意识到break在Ruby case语句中对我更熟悉的其他语言的行为有所不同,所以我认为它不会做你想要的。
  3. 你也可以这样做:

    while (input = gets)
      case input.chomp.downcase
      when 'exit'
        break        
    
      # other when statements
    
      else
        puts "That is not a valid command. Type 'HELP' for available commands."
      end
    end
    

    编辑:我很高兴听到像Perl一样,Ruby也有$_变量,gets的值将被赋予:

    while gets
      case $_.chomp.downcase
      when 'exit'
        break        
    
      # other when statements
    
      else
        puts "That is not a valid command. Type 'HELP' for available commands."
      end
    end
    

答案 2 :(得分:1)

您甚至可以通过使用input退出循环而不是在while条件中检查结果来摆脱break

while true
  case gets.chomp.downcase
    when 'exit'
      break
    when 'help'
      # stuff
    else
      # other stuff
  end
end