“While”循环Ruby中的多个条件

时间:2013-05-27 01:43:03

标签: ruby

我正在创建一个应用,告诉我们一年中每个月中1到12的每个数字代表什么,例如1 = January2 = February等。这是初始代码

print "Please, tell me the month's number!"
number = gets.chomp.to_i
while number > 12  do
    print "Please, re-type it again!"
    number = gets.chomp.to_i
end
case number
    when 1 then print "This is January!"
    when 2 then print "This is February!"
    when 3 then print "This is March!"
    when 4 then print "This is April!"
    when 5 then print "This is May!"
    when 6 then print "This is June!"
    when 7 then print "This is July!"
    when 8 then print "This is August!"
    when 9 then print "This is September!"
    when 10 then print "This is October!"
    when 11 then print "This is November!"
    when 12 then print "This is December!"
    else print "I can't undestand you, i'm sorry!"
end

现在,设置了基本逻辑。我认为唯一缺少的是while循环中的第二个条件,它定义了如果输入不是整数,我需要重新键入它。我试图在while循环中正确定义第二个条件,但到目前为止没有结果。我该怎么办?

如何让代码更好?在这种情况下,while循环是正确的工作方法吗?

5 个答案:

答案 0 :(得分:2)

这是使您的代码更好的另一种方法:

require 'date'
print "Please, tell me the month's number! "
number = gets.to_i
until number.between?(1,12) do
  print "Please, re-type it again! "
  number = gets.to_i
end
month_name = Hash.new
(1..12).each do |month_num|
  month_name[month_num] = Date::MONTHNAMES[month_num]
end
print "This is #{month_name[number]}!"

如其他答案中所述,如果使用chomp则不需要to_i,因为转换为整数将处理新行。 我按照@steenslag的建议使用number.between?(1,12)检查输入是否有效。

我尝试了Hash方法而不是case语句。 while循环是实现此目的的一种方法,但这只是另一种完成此任务的方法。

答案 1 :(得分:1)

print "Please, tell me the month's number!"
number = gets.to_i

如果您打算使用chomp,则永远不需要to_i,因为数字的本质表明它永远不会有一行结束。

until number > 1 && number < 12  do

您确实希望该号码包含1到12,对吗?

你可以选择这样做,

until (1..12).include?(number) do

或者@teenslag说,

until number.between?(1, 12) do

我认为要么阅读更容易,between?方法可能是更好的选择。

    print "Please, re-type it again!"
    number = gets.to_i
end

这可能非常干,或者使用内置的Date对象,如上所述。但是,让我们以同样的精神看看我们可以用代码做什么:

case number
    when 1 then print "This is January!"
    when 2 then print "This is February!"
    when 3 then print "This is March!"
    when 4 then print "This is April!"
    when 5 then print "This is May!"
    when 6 then print "This is June!"
    when 7 then print "This is July!"
    when 8 then print "This is August!"
    when 9 then print "This is September!"
    when 10 then print "This is October!"
    when 11 then print "This is November!"
    when 12 then print "This is December!"
end 

转向:

answer = case number
         when 1
           "January"
         when 2
           "February"
         when 3
           "March"
         when 4
           "April"
         when 5
           "May"
         when 6
           "June"
         when 7
           "July"
         when 8
           "August"
         when 9
           "September"
         when 10
           "October"
         when 11
           "November"
         when 12
           "December"
         end
print "This is #{answer}!"

虽然使用Date类会更好。

如果您无法使用,那么我可能会考虑在此使用哈希。我会让你探讨这些选择。

甚至是数组。记住数组元素从位置0开始:

print "Please, tell me the month's number!"
until (number = gets.to_i).between?(1,12) do
    print "Please, re-type it again!"
end
months = %w[January February March April May June July August September October November December]
puts "This is #{months[number - 1]}!"

答案 2 :(得分:0)

number将始终为整数,因为您将其转换为整数。

"foo".to_i
 => 0

您可能希望改用范围。

until (1..12).include?(gets.chomp.to_i)
  print "Please, re-type it again!"
end

您还可以使用内置数字转换为月份来干燥您的代码:

number = 4
Date::MONTHNAMES[number]
 => "April"

答案 3 :(得分:0)

如上述海报所述,此特定实例不需要第二个条件。但是,如果在循环中需要多个条件,则可以使用逻辑AND或逻辑OR运算符。

逻辑AND运算符为&&。逻辑OR运算符为||。如果两个条件都必须为真,则可以使用&&来继续循环。如果其中一个或另一个需要为真以继续循环,则使用||

例如:

while number > 12 || number == 0 do
    stuff...
end

while number > 0 && number < 13 do
    stuff...
end

在第一个片段中,如果输入的数字大于12或等于0,您将进入循环。如果输入的数字大于0且小于13,您将进入循环。(显然,第二个与你在这里使用while循环完全相反,但包含在演示中。)

答案 4 :(得分:0)

您需要的一个简单循环:

until month_num > 0 && month_num < 13 do
 # prompt again
end

更惯用的方式是在两者之间使用?还是包含?

until month_num.between? (1, 12) do
  # prompt again
end

您可以使用Date模块中的哈希映射来代替多个when then:-Date::MONTHNAMES[month_num]