免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2656 | 回复: 1
打印 上一主题 下一主题

A.9 范围 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-17 19:59 |只看该作者 |倒序浏览
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
}

使用自定义对象来创建范围我们在面向对象中讲解。

论坛徽章:
0
2 [报告]
发表于 2011-03-17 20:00 |只看该作者
补充总结一下范围(区间、Range):
一、范围的形式
1、闭区间, 两点形式,如 1..5
2、半开区间,三点形式,如1...5,区间中不包含5
二、区间的作用
1、作为连续的值使用(序列);
2、作为间隔来使用,一般用在判断某值是否落在区间
3、作为条件来使用
前两种使用方法很简单,也很常用。不作罗嗦,主要看看区间作为布尔值的用法。
区间在布尔表达式中是一个状态机(flip-flop)形式,只有 set/unset 两个状态,一开始range处于unset状态。后面的状态转变与返回值如图(可惜论坛上传不了图。那我就传个伪代码上来吧,看起来麻烦点,不过很准确)
  1. #对于闭range的判断流程, 假设是e1..e2   
  2. if range=unset   
  3.   return false unless e1   
  4.   range=set   
  5.   range=unset if e2=true   
  6.   return true   
  7. else   
  8.   range=unset if e2=true   
  9.   return true   
  10. end   
  11.    
  12. #对于半开半闭range的判断流程, 假设是e1...e2   
  13. if range=unset   
  14.   return false unless e1   
  15.   range=set   
  16.   return true   
  17. else   
  18.   range=unset if e2=true   
  19.   return true   
  20. 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP