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