当前位置:  首页>> 技术小册>> Ruby入门教程

范围(Range)无处不在:a 到 z、 0 到 9、等等。Ruby 支持范围,并允许我们以不同的方式使用范围:

作为序列的范围
作为条件的范围
作为间隔的范围
作为序列的范围

范围的第一个也是最常见的用途是表达序列。序列有一个起点、一个终点和一个在序列产生连续值的方式。

Ruby 使用 .. 和 … 范围运算符创建这些序列。两点形式创建一个包含指定的最高值的范围,三点形式创建一个不包含指定的最高值的范围。

  1. (1..5) #==> 1, 2, 3, 4, 5
  2. (1...5) #==> 1, 2, 3, 4
  3. ('a'..'d') #==> 'a', 'b', 'c', 'd'

序列 1..100 是一个 Range 对象,包含了两个 Fixnum 对象的引用。如果需要,您可以使用 to_a 方法把范围转换为列表。尝试下面的实例:

实例

  1. #!/usr/bin/ruby
  2. $, =", " # Array 值分隔符
  3. range1 = (1..10).to_a
  4. range2 = ('bar'..'bat').to_a
  5. puts "#{range1}"
  6. puts "#{range2}"

以上实例运行输出结果为:

  1. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  2. ["bar", "bas", "bat"]

范围实现了让您可以遍历它们的方法,您可以通过多种方式检查它们的内容:

实例

  1. #!/usr/bin/ruby
  2. # -*- coding: UTF-8 -*-
  3. # 指定范围
  4. digits = 0..9
  5. puts digits.include?(5)
  6. ret = digits.min
  7. puts "最小值为 #{ret}"
  8. ret = digits.max
  9. puts "最大值为 #{ret}"
  10. ret = digits.reject {|i| i < 5 }
  11. puts "不符合条件的有 #{ret}"
  12. digits.each do |digit|
  13. puts "在循环中 #{digit}"
  14. end

以上实例运行输出结果为:

  1. true
  2. 最小值为 0
  3. 最大值为 9
  4. 不符合条件的有 [5, 6, 7, 8, 9]
  5. 在循环中 0
  6. 在循环中 1
  7. 在循环中 2
  8. 在循环中 3
  9. 在循环中 4
  10. 在循环中 5
  11. 在循环中 6
  12. 在循环中 7
  13. 在循环中 8
  14. 在循环中 9

作为条件的范围

范围也可以用作条件表达式。例如,下面的代码片段从标准输入打印行,其中每个集合的第一行包含单词 start,最后一行包含单词 end.:

  1. while gets
  2. print if /start/../end/
  3. end

范围可以用在 case 语句中:

实例

  1. #!/usr/bin/ruby
  2. # -*- coding: UTF-8 -*-
  3. score = 70
  4. result = case score
  5. when 0..40
  6. "糟糕的分数"
  7. when 41..60
  8. "快要及格"
  9. when 61..70
  10. "及格分数"
  11. when 71..100
  12. "良好分数"
  13. else
  14. "错误的分数"
  15. end
  16. puts result

以上实例运行输出结果为:

  1. 及格分数

作为间隔的范围

范围的最后一个用途是间隔检测:检查指定值是否在指定的范围内。需要使用 === 相等运算符来完成计算。

实例

  1. #!/usr/bin/ruby
  2. # -*- coding: UTF-8 -*-
  3. if ((1..10) === 5)
  4. puts "5 在 (1..10)"
  5. end
  6. if (('a'..'j') === 'c')
  7. puts "c 在 ('a'..'j')"
  8. end
  9. if (('a'..'j') === 'z')
  10. puts "z 在 ('a'..'j')"
  11. end

以上实例运行输出结果为:

  1. 5 (1..10)
  2. c ('a'..'j')

该分类下的相关小册推荐:

暂无相关推荐.