Ruby - 范围
范围无处不在: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 object 包含对两个 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,最后一行包含单词 ends −
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')