A.9 范围

上一篇 / 下一篇  2008-06-30 00:08:21

查看( 8 ) / 评论( 8 )
范围(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
}

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

[ 本帖最后由 quzhongwei 于 2008-6-30 00:29 编辑 ]

TAG:

1piece发布于2008-06-30 14:40:07
首先感谢搂住发帖,学习了,谢谢。
以下是关于此次学习的问题:
reject 将范围转换为一个数组,并删除掉满足条件的元素

a = 1..5 # 1, 2, 3, 4, 5
puts a.reject { |i| i<3 }
但我得到是这样的结果:
@a = [0,1,2,3,4,5]
=> [0, 1, 2, 3, 4, 5]
irb(main):033:0> puts @a
0
1
2
3
4
5
=> nil
irb(main):034:0> puts @a.reject{|i| i<4}
4
5
=> nil
irb(main):035:0> puts @a
0
1
2
3
4
5
=> nil
有点疑惑。。。
黑马发布于2008-06-30 15:40:50
reject是返回处理过的数据。如果想修改原数据,请用reject!
而reject是阻止符合条件的元素,也就是说block返回真,则被删除掉。所以是上面的结果。

[ 本帖最后由 黑马 于 2008-6-30 15:47 编辑 ]
1piece发布于2008-06-30 16:26:21

QUOTE:

原帖由 黑马 于 2008-6-30 15:40 发表
reject是返回处理过的数据。如果想修改原数据,请用reject!
而reject是阻止符合条件的元素,也就是说block返回真,则被删除掉。所以是上面的结果。
恩 是这样啊,谢谢指点迷津。
想起用过这样的一个方法,delete_if{|x|x>3},好像是这样的,和reject!有点异曲同工之效。
谢谢,学习了。
liuxueming发布于2008-07-01 14:14:10
reject! 方法请问如何用呢
黑马发布于2008-07-07 20:34:54
补充总结一下范围(区间、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

[ 本帖最后由 黑马 于 2008-7-7 22:38 编辑 ]
刀光剑影发布于2008-07-07 23:17:32
论坛上不能上传图片.我找个网站,把图补上......


[ 本帖最后由 刀光剑影 于 2008-7-9 14:28 编辑 ]
sevk发布于2008-07-13 10:09:37
a=(11..20).collect{|i|(i%4==0)..(i%3==0)?1:0}
a=(11..20).collect{|i|(i%4==0)...(i%3==0)?1:0}

用区间作条件真够复杂!
nj0308发布于2008-10-22 21:17:14
在什么条件下用的上以区间作为条件呢?其内在的含义究竟是什么呢?
我来说两句

(可选)

日历

« 2008-11-22  
      1
2345678
9101112131415
16171819202122
23242526272829
30      

我的存档

数据统计

  • 访问量: 44
  • 日志数: 19
  • 建立时间: 2008-06-11
  • 更新时间: 2008-06-11

RSS订阅

Open Toolbar