范围遍布各处:1月至12月,0至9,第50至67行,依此类推. Ruby支持范围并允许我们以各种方式使用范围 :
范围为序列
作为条件的范围
作为间隔的范围
范围的第一个也许是最自然的用法是表达序列.序列有一个起点,一个终点,以及在序列中产生连续值的方法.
Ruby使用''创建这些序列.'''和''...''范围运算符.双点形式创建一个包含范围,而三点形式创建一个排除指定高值的范围.
(1..5) #==> 1, 2, 3, 4, 5 (1...5) #==> 1, 2, 3, 4 ('a'..'d') #==> 'a', 'b', 'c', 'd'
序列1..100作为Range 对象保存包含对两个 Fixnum 对象的引用.如果需要,可以使用 to_a 方法将范围转换为列表.请尝试以下示例 :
#!/usr/bin/ruby $, =", " # Array value separator range1 = (1..10).to_a range2 = ('bar'..'bat').to_a puts "#{range1}" puts "#{range2}"
这将产生以下结果 :
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ["bar", "bas", "bat"]
Ranges实现的方法可以让你迭代它们并以各种方式测试它们的内容 :
#!/usr/bin/ruby # Assume a range digits = 0..9 puts digits.include?(5) ret = digits.min puts "Min value is #{ret}" ret = digits.max puts "Max value is #{ret}" ret = digits.reject {|i| i < 5 } puts "Rejected values are #{ret}" digits.each do |digit| puts "In Loop #{digit}" end
这将产生以下结果 :
true Min value is 0 Max value is 9 Rejected values are 5, 6, 7, 8, 9 In Loop 0 In Loop 1 In Loop 2 In Loop 3 In Loop 4 In Loop 5 In Loop 6 In Loop 7 In Loop 8 In Loop 9
范围也可以用作条件表达式.例如,以下代码片段打印标准输入中的行集,其中每个集合中的第一行包含单词 start ,最后一行单词结束 :
while gets print if /start/../end/ end
可以在case语句中使用范围 :
#!/usr/bin/ruby score = 70 result = case score when 0..40 then "Fail" when 41..60 then "Pass" when 61..70 then "Pass with Merit" when 71..100 then "Pass with Distinction" else "Invalid Score" end puts result
这将产生以下结果 :
Pass with Merit
多功能范围的最终用途是作为间隔测试:查看某个值是否在范围所代表的区间内.这是使用===,大小写相等运算符完成的.
#!/usr/bin/ruby if ((1..10) === 5) puts "5 lies in (1..10)" end if (('a'..'j') === 'c') puts "c lies in ('a'..'j')" end if (('a'..'j') === 'z') puts "z lies in ('a'..'j')" end
这将产生以下结果 :
5 lies in (1..10) c lies in ('a'..'j')