If..Elsif
毫无疑问,你总会遇到需要根据几种替代条件来采取不同的行为。这样做的一种实现方式是通过判断一个 if
测试,然后在关键字 elsif
之后再放置一系列其它测试条件。然后必须使用 end
关键字终止。
例如,这里我通过在 while
循环中反复获取用户输入信息,if
测试来判断用户是否输入了 ‘q’(我已经用 chomp()
方法从输入中删除了回车符);如果输入的不是 ‘q’ 则第一个 elsif
测试判断输入的整数值(input.to_i
)是否大于 800;该测试失败后,下一个 elsif
测试判断整数值是否小于等于 800:
if_elsif.rb
while input != 'q' do
puts("Enter a number between 1 and 1000 (or 'q' to quit)")
print("?- ")
input = gets().chomp()
if input == 'q'
puts( "Bye" )
elsif input.to_i > 800
puts( "That's a high rate of pay!" )
elsif input.to_i <= 800
puts( "We can afford that" )
end
end
这个程序的问题在于,即使它要求用户输入一个 1 到 1000 的值,它也可能会接收到一个小于 1(当然,你如果想要一份负数的薪水,我很乐意为你提供一份工作!)或者大于 1000(在这种情况下,不要找我找工作!)的值。
我们可以通过重写两个 elsif
测试并添加一个 else
部分,如果所有前面的测试都失败则执行该部分,来解决这个问题:
if_elsif2.rb
if input == 'q'
puts( "Bye" )
elsif input.to_i > 800 && input.to_i <= 1000
puts( "That's a high rate of pay!" )
elsif input.to_i <= 800 && input.to_i > 0
puts( "We can afford that" )
else
puts( "I said: Enter a number between 1 and 1000!" )
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” )当测试条件复杂时(如果使用多个 and
和 or
),则应将其括在括号中。如果测试和代码跨越几行, ?
必须与前一个条件放在同一行,并且 :
必须与紧跟在 ?
之后的代码放在同一行。换句话说,如果你在 ?
或者 :
之前添加换行符,你将得到一个语法错误。 这是正确的多行代码块的示例: (aDay == ‘Saturday’ or aDay == ‘Sunday’) ? daytype = ‘weekend’ : daytype = ‘weekdaydays2.rb
这有另一个示例,一个长的 if..elsif
序列,并且有 else
部分处理其它所有情况。这次的测试值 i
是一个整数:
def showDay( i )
if i == 1 then puts("It's Monday" )
elsif i == 2 then puts("It's Tuesday" )
elsif i == 3 then puts("It's Wednesday" )
elsif i == 4 then puts("It's Thursday" )
elsif i == 5 then puts("It's Friday" )
elsif (6..7) === i then puts( "Yippee! It's the weekend! " )
else puts( "That's not a real day!" )
end
end
请注意,我使用范围(range) (6..7)
来匹配代表星期六和星期天的两个整数值。这里的 ===
方法(三个 =
字符)测试一个值(这里是 i
)是否在范围(range)中。上面的示例:
(6..7) === i
…可以重写为:
(6..7).include?(i)
===
方法由 Object 类定义,并在后代类中重写。它的行为因所属类而异。我们将很快看到,它的一个基本用途是为测试语句提供有意义的判断。