跳到主要内容

Ruby 的范围

Ruby 的范围(Ranges)允许以范围的形式表示数据(换句话说,数据集具有开始和结束值以及介于两者之间的值的逻辑顺序)。范围内的值可以是数字,字符,字符串或对象。在本章中,我们将研究Ruby 支持的三种范围,即序列,条件和间隔。

1. 范围作为序列

Ruby 中的序列范围用于创建一系列连续值-由开始值,结束值和介于两者之间的值范围组成。

实例:

1..10    # 1 ~ 10 的序列
1...10 # 1 - 9 的序列

解释:有两个运算符可用于创建此类范围,包括两个点(..)的运算符和三个点(...)的运算符,他们的区别是两个点的运算符包括范围的第一个值和最后一个值,三个点的运算符不包括最后一个值

实例:

# 我们可以通过to\_a方法将序列转换成数组

> (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

> (1...10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]

我们还可以创建一个基于字符的序列:

> ('a'..'l').to_a
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"]

2. 范围的实例方法

鉴于 Ruby 的面向对象特性,范围实际上也是一个对象。这样,在使用范围对象时,可以访问 Range类的许多方法:

实例:

words = 'a'..'l'
a.class
=> Range

2.1 获取范围最小值

使用 min 方法:

words.min        
=> "a"

2.2 获取范围最大值

使用 max 方法:

words.max       
=> "l"

2.3 查看是否在范围内

使用 include? 方法:

words.include?('b') 
=> true

2.4 过滤不符合范围的值

使用 reject 并在 block 中传递条件:

words.reject {|subrange| subrange < 'f'}
=> ["f", "g", "h", "i", "j", "k", "l"]

2.5 遍历范围

使用 each 迭代器:

words.each {|word| puts "Hello " + word}
Hello a
Hello b
Hello c
Hello d
Hello e
Hello f
Hello g
Hello h
Hello i
Hello j
Hello k
Hello l
=> "a".."l"

3. 范围作为条件

范围也可以用作条件表达式,一般和 case 一起使用。

实例:

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

4. 范围作为间隔

范围是识别值是否落在特定范围内的理想选择。例如,我们可能想知道数字是在一定范围内,还是某个字母组中的字母(按字母顺序排列)。这是通过 === 等于运算符实现的。

实例:

# 判断15是否在1~20之间
(1..20) === 15
=> true

# 判断m是否在k~z字母之间
('k'..'z') === 'm'
=> true

5. 小结

本章节中,我们学习了范围的概念、如何创建一个范围,范围的三种使用方法分别是序列、条件与间隔。并且了解了范围的实例方法。