ruby使用区间实现了3中不同特性:序列,条件和间隔。
一、序列
在ruby中只用".."和"..."区间操作符来创建序列。两个点的形式是创建闭合的区间(包括右端的值),而3个点的形式
是创建半开半闭的区间(不包括右端的值)。
注意:
1、任何类型的对象都可以构造区间,只要这些对象可以使用它们的<=>操作符来进行比较,同时支持succ方法,返回序列中的下一个对象
2、区间在内部用列表表示,1..100序列被存储为Range对象,它包含对两个Fixum对象的引用。可以通过to_a方法把区间转换成列表。
(1..10).to_a ---[1,2,3,4,5,6,7,8,9,10]
二、区间作为条件
当区间作为条件的时候,它表现的就像一个双向开关,当区间的第一部分的条件为true时,它们就打开,当区间第二部分
的条件为true时,他们就关闭。
注意,每一个区间对象唯一对应一个状态机。
1、在条件语句中区间作为条件时,当开始条件为true时,状态机从原来状态变更一次,然后紧接着判断结束条件,如果
结束条件为false,则状态机的最终状态为由开始条件时的状态,如果为true,则状态机的发生状态变更。
注意,结束条件的发生的状态变更不会影响这条语句的返回结果,这个语句的返回结果由开始条件所决定的状态机的结果而定。
但是状态机的结果受结束条件的影响。
2、在循环或迭代中运用区间作为条件时,如果每次循环或迭代所使用的区间对象是同一个对象,那么每次循环后的状态机将影响下次循环。
下面是列子:
- puts a = (11..20).collect {|i| (i%4==0)..(i%3==0) ? i : nil}
结果显示如下:
1、 如果状态机原来状态是关,且开始条件为true,则状态机将从关变成开,如果状态机原来状态是开,则状态不变
2、 如果状态机状态为开,且结束条件为true,则状态机将从开变关,如果状态机状态是关,则状态不变。
3、 调用的返回结果由当前状态机的状态列决定。如果为开就返回true,否则返回false
4、 区间对象第一次调用时,其状态机状态为关,以后每次调用时,其状态机的初始状态是上次调用结束后状态机的状态。
注意:如果是采用三点式的区间不会在进入开状态后立即进入求解结束条件,
三、区间作为间隔
区间作为间隔测试:用于判断一些值是否会落入区间表达的间隔内。使用===操作符完成这个。