范围无处不在: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作为范围对象保留,其中包含对两个 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"]
范围序列的方法可以让您以各种方式对其进行迭代并测试其内容-
#!/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
范围也可以用作条件表达式。如以下代码片段从标准输入中打印,其中每组的第一行包含单词开始,最后一行包含单词结束-
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')
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)