Sunday, October 19, 2008

(16)Ruby中的范围对象Rnage

Range对象描述了一段开始和结束的值,值与值之间用两个或三个点号隔开,如果用两个点号表明范围的值包括开始和结束点的所有值,如果是三个点号,表示范围的值包括开始到结束,但是不包括最后一个结束值:
1..10      # 表示1到10之间的值,包括10
1.0...10.0 # 表示1.0到10.0之间的值,但是不包括10.0

可以通过include?方法判断Range是否包含一个指定的值:
cold_war = 1945..1989
cold_war.include? birthdate.year

Rnage对象的另一个用途是迭代,比如step,each,以及Enumerable方法:
r = 'a'..'c'
r.each {|l| print "[#{l}]"} # 打印"[a][b][c]"
r.step(2) { |l| print "[#{l}]"} # 打印"[a][c]"
r.to_a # => ['a','b','c']:to_a方法将Range对象转换为数组

succ方法用于返回当前字符的下一个字符,比如:'a'.succ是'b','b'.succ是'c'以此类推,Range对象的内容排序就是依据这个规则。注意如果你想直接在一个Range对象上调用方法,你必须用()包含他们:(1..3).step{#..some method}:
1..3.to_a    # 这样是错误的
(1..3).to_a # => [1,2,3],必须用()包含。

在Ruby1.8中定义了include?和member?用于测试一个值是否包含在Range对象中,Ruby1.9中定义了另一个方法cover?它实现了相同的功能,但是这个方法的效率更高:
triples = "AAA".."ZZZ"
triples.include? "ABC" # true; 在1.8中执行效率要高于1.9
triples.include? "ABCD" # true 在1.8中可以运行,在1.9中返回false
triples.cover? "ABCD" # true 1.9中效率更高
triples.to_a.include? "ABCD" # 返回false在 1.8 和 1.9中效率头很低

No comments: