A.9 范围
A.9 范围范围(Range)可以是多枚举值的一种简单形式,有两种形式:
a = 1..5 # 1, 2, 3, 4, 5
b = 1...5 # 1, 2, 3, 4
puts a.to_a
puts b.to_a
这里a,b是Range的对象。它们都分别包含两个Fixnum对象的引用。
Range类有下列常用方法:
1、 to_a() 将范围转化为数组
2、 include?(value)/===(value) 判断范围内是否有value
3、 min()/begin()/first() 返回范围的最小值/第一个值
4、 max()/end()/last() 返回范围的最大值/最后一个值
5、 reject 将范围转换为一个数组,并删除掉满足条件的元素
a = 1..5 # 1, 2, 3, 4, 5
puts a.reject { |i| i<3 }
6、 select 将范围转化为一个数组,只选择满足条件的元素
a = 1..5 # 1, 2, 3, 4, 5
puts a.select { |i| i<3 }
7、each 迭代范围里的每个元素
(1..5).each { |i|
puts i
}
使用自定义对象来创建范围我们在面向对象中讲解。 补充总结一下范围(区间、Range):
一、范围的形式
1、闭区间, 两点形式,如 1..5
2、半开区间,三点形式,如1...5,区间中不包含5
二、区间的作用
1、作为连续的值使用(序列);
2、作为间隔来使用,一般用在判断某值是否落在区间
3、作为条件来使用
前两种使用方法很简单,也很常用。不作罗嗦,主要看看区间作为布尔值的用法。
区间在布尔表达式中是一个状态机(flip-flop)形式,只有 set/unset 两个状态,一开始range处于unset状态。后面的状态转变与返回值如图(可惜论坛上传不了图。那我就传个伪代码上来吧,看起来麻烦点,不过很准确)#对于闭range的判断流程, 假设是e1..e2
if range=unset
return false unless e1
range=set
range=unset if e2=true
return true
else
range=unset if e2=true
return true
end
#对于半开半闭range的判断流程, 假设是e1...e2
if range=unset
return false unless e1
range=set
return true
else
range=unset if e2=true
return true
end请运行下面代码,对照着上面的模拟流程,自己核对一下。
a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil)
a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil)
三、自己定义区间类
1、只要你的类拥有 <=> 和 succ 方法,并且,<=>接受一个参数,返回-1,0,1,succ返回当前类的一个对象作为后继。那么此类对象及可用于Range
页:
[1]