条件区间
expr1..expr2 expr1...expr2
初始状态机为关闭,当expr1为真是状态机打开,直到expr2为真时状态机关闭,再到expr1为真时再打开。2个点时,当状态机打开后执行完当前语句会接着检查expr2,如果expr2为真会关闭状态机,3个点时则不会再接着检查expr2,会在接下来的语句中再检查expr2的值。
例1:
while line=gets puts line if line=~/start/..line=~/end/ end
当line包含start时开始打印,直到line中包含end时,打印该行后结束打印。使用2个点表示如果line中即包含start又包含end时开关开启后打印完该行接着关闭,之后的行不再打印,直到line中包含start再开始打印。如果是3个点,则开关打开并打印该行后不再检查是否有end,继续往下打印,直到line中包含end时打印该行并结束打印。
例2:
a = (11..20).each {|i| print i," " if (i%4 == 0)..(i%3 == 0)} =>12 16 17 18 20 #初始状态要为假,i=11时不满条件1,所以不打印,当i=12时满足(i%4 == 0),这时打印12,再检查(i%3 == 0)也满足,这时状态机关闭,所以后面的值只要不满足(i%4 == 0)的都不打印,直到i=16时再次满足(i%4 == 0),状态机开启,打印16,检查i%3 == 0不满足,所以状态机一直是开启状态,17,18打印,当i=18时满足i%3 == 0所以状态机关闭,直到i=20时满足i%4 == 0,所以打印20.
a = (11..20).each {|i| print i," " if (i%4 == 0)...(i%3 == 0)} =>12 13 14 15 16 17 18 20 #当区间为3个点时,当状态机开启后不再检查条件2,所以当i=12时满足条件1,状态机开启,打印12,不再检查条件2,这时状态机一直是开启,所以后面的值一直打印,直到i=18满足条件2这时状态机关闭。<br>
if ... then
#...
elsif #... else #... end
unless ... then #... end
case when ... #... when ... #... else #... end
#处理异常
begin/def method
#code
rescue Exception => e #rescue可以有多个,每个可以指定多个异常参数,异常被保存在$!中,不带参数的raise将重新引发$!异常
#error handing code
else
#no exception code
ensure
#always executed code
end
网友评论