If..Elsif

毫无疑问,你总会遇到需要根据几种替代条件来采取不同的行为。这样做的一种实现方式是通过判断一个 if 测试,然后在关键字 elsif 之后再放置一系列其它测试条件。然后必须使用 end 关键字终止。

例如,这里我通过在 while 循环中反复获取用户输入信息,if 测试来判断用户是否输入了 ‘q’(我已经用 chomp() 方法从输入中删除了回车符);如果输入的不是 ‘q’ 则第一个 elsif 测试判断输入的整数值(input.to_i)是否大于 800;该测试失败后,下一个 elsif 测试判断整数值是否小于等于 800:

if_elsif.rb
  1. while input != 'q' do
  2. puts("Enter a number between 1 and 1000 (or 'q' to quit)")
  3. print("?- ")
  4. input = gets().chomp()
  5. if input == 'q'
  6. puts( "Bye" )
  7. elsif input.to_i > 800
  8. puts( "That's a high rate of pay!" )
  9. elsif input.to_i <= 800
  10. puts( "We can afford that" )
  11. end
  12. end

这个程序的问题在于,即使它要求用户输入一个 1 到 1000 的值,它也可能会接收到一个小于 1(当然,你如果想要一份负数的薪水,我很乐意为你提供一份工作!)或者大于 1000(在这种情况下,不要找我找工作!)的值。

我们可以通过重写两个 elsif 测试并添加一个 else 部分,如果所有前面的测试都失败则执行该部分,来解决这个问题:

if_elsif2.rb
  1. if input == 'q'
  2. puts( "Bye" )
  3. elsif input.to_i > 800 && input.to_i <= 1000
  4. puts( "That's a high rate of pay!" )
  5. elsif input.to_i <= 800 && input.to_i > 0
  6. puts( "We can afford that" )
  7. else
  8. puts( "I said: Enter a number between 1 and 1000!" )
  9. end
if_else_alt.rb
Ruby 也有一种 if..then..else 的简写方式,用 ? 替换掉 if..then 部分,并用一个 : 当作 else …<Test Condition> ? <if true do this> : <else do this>例如: x == 10 ? puts(“it’s 10”) : puts( “it’s some other number” )当测试条件复杂时(如果使用多个 andor),则应将其括在括号中。如果测试和代码跨越几行, ? 必须与前一个条件放在同一行,并且 : 必须与紧跟在 ? 之后的代码放在同一行。换句话说,如果你在 ? 或者 : 之前添加换行符,你将得到一个语法错误。 这是正确的多行代码块的示例: (aDay == ‘Saturday’ or aDay == ‘Sunday’) ? daytype = ‘weekend’ : daytype = ‘weekday
days2.rb

这有另一个示例,一个长的 if..elsif 序列,并且有 else 部分处理其它所有情况。这次的测试值 i 是一个整数:

  1. def showDay( i )
  2. if i == 1 then puts("It's Monday" )
  3. elsif i == 2 then puts("It's Tuesday" )
  4. elsif i == 3 then puts("It's Wednesday" )
  5. elsif i == 4 then puts("It's Thursday" )
  6. elsif i == 5 then puts("It's Friday" )
  7. elsif (6..7) === i then puts( "Yippee! It's the weekend! " )
  8. else puts( "That's not a real day!" )
  9. end
  10. end

请注意,我使用范围(range) (6..7) 来匹配代表星期六和星期天的两个整数值。这里的 === 方法(三个 = 字符)测试一个值(这里是 i)是否在范围(range)中。上面的示例:

  1. (6..7) === i

…可以重写为:

  1. (6..7).include?(i)

=== 方法由 Object 类定义,并在后代类中重写。它的行为因所属类而异。我们将很快看到,它的一个基本用途是为测试语句提供有意义的判断。