Range

范围对象的类。范围对象是由范围操作符..或...生成的。由..操作符生成的范围对象包括范围终点,而由...操作符生成的范围对象不包括范围终点。

例:

for i in 1..5
   ...
end

生成从1到5的范围对象,然后对分别每个值进行迭代操作。

范围操作符的操作对象必须能够接受<=>所进行的比较操作。而且,只有当它们能够使用succ方法时,才能执行Range#each操作。

超类:

包含模块:

类方法:

Range.new(first,last[, exclude_end])

生成并返回一个从firstlast的范围对象。若exclude_end为真,则该对象不包含范围终点。若省略exclude_end,则包含范围终点。

生成对象时,会执行

first <=> last

以检查参数的合法性。若返回nil,则引发ArgumentError异常。

方法:

self === other
include?(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
begin
first

返回最初的元素。

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]
end
last

返回范围终点。这与范围对象是否包含范围终点无关。

p (1..5).end   # => 5
p (1...5).end  # => 5
exclude_end?

范围对象不包含范围终点时返回真。

length
size

返回范围的长度。若范围起点和终点都是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"