范围对象的类。范围对象是由范围操作符..或...生成的。由..操作符生成的范围对象包括范围终点,而由...操作符生成的范围对象不包括范围终点。
例:
for i in 1..5 ... end
生成从1到5的范围对象,然后对分别每个值进行迭代操作。
范围操作符的操作对象必须能够接受<=>所进行的比较操作。而且,只有当它们能够使用succ方法时,才能执行Range#each操作。
Range.new(first,last[, exclude_end])生成并返回一个从first到last的范围对象。若exclude_end为真,则该对象不包含范围终点。若省略exclude_end,则包含范围终点。
生成对象时,会执行
first <=> last
以检查参数的合法性。若返回nil,则引发ArgumentError异常。
self === otherinclude?(other) ((<ruby 1.7 特性>))若other在范围内则返回真。
===主要用在case句的比较中。
ruby 1.7 特性:请注意,include?与Enumerable#include?以及Enumerable#member?有所不同,它使用<=>方法来判断是否在范围内。(截止1.6版本为止,include?与member?同是Enumerable的方法)
p (0.1 .. 0.2).include?(0.15) # => true
p (0.1 .. 0.2).member?(0.15) # => cannot iterate from Float (TypeError)
# 比较字符串时,include?将按照字典顺序进行比较
p ("a" .. "c").include?("ba") # => true
p ("a" .. "c").member?("ba") # => false
beginfirst返回最初的元素。
each {|item| ... }对范围内的元素进行迭代操作。
ruby 1.7 特性:Range#each使用各元素的succ 方法进行迭代操作。截止1.6版本为止,对Numeric对象一直采用的是算术运算。正因为作出了这个变更,所以不得不修改Float中的Range的处理方法。(Float没有succ)。
(1.0 .. 2.0).each {|v| p v}
=> ruby 1.6.7 (2002-03-01) [i586-linux]
1
2
=> -:1:in `each': cannot iterate from Float (TypeError)
from -:1
ruby 1.7.3 (2002-09-02) [i586-linux]
endlast返回范围终点。这与范围对象是否包含范围终点无关。
p (1..5).end # => 5 p (1...5).end # => 5
exclude_end?范围对象不包含范围终点时返回真。
lengthsize返回范围的长度。若范围起点和终点都是Integer的实例时,就是
(last - first + (exclude_end? ? 0 : 1))
这样。除此以外,则返回each的执行范围。
ruby 1.7 特性:取消了length和size方法。若确实需要的话,可以这样
p ("a" .. "z").to_a.size
=> 26
即可。
step([s]) {|item| ... }ruby 1.7 特性
以s的步长对范围内的元素进行迭代操作。s是正整数。默认值为1。
("a" .. "f").step(2) {|v| p v}
# => "a"
"c"
"e"