Range
对象表现为一个间隔,有开始与结束的值集。
Range
对象可以由范围操作符
s..e
及
s…e
字面值,或者用
Range::new
构建。由
..
操作符构建的
Range
对象包括范围的终点
end
值,而由
…
操作符构建的
Range
对象不包括范围的终点
end
值。当用于迭代器对象时,
Range
对象返回序列内的每一个值。
例如:
for i in 1..5
…
end
生成从
1
到
5
的
Range
对象,然后对分别每个值进行迭代操作。
再如:
(-1..-5).to_a
#=> []
(-5..-1).to_a
#=> [-5, -4, -3, -2, -1]
('a'..'e').to_a
#=> ["a", "b", "c", "d", "e"]
('a'...'e').to_a
#=> ["a", "b", "c", "d"]
Range
对象可以由任何类型的对象构建,只要这个对象能够使用它们的
<=>
操作符,而且它们支持
succ
方法来返回序列内的下一个对象。也就是说,范围操作符的操作对象必须实现
<=>
比较操作,而且实现
succ
方法,则这个操作对象才能执行
Range#each
操作。
例如:
class Xs
# 'x'
表示字符串
include Comparable
attr :length
def initialize(n)
@length = n
end
def succ
#succ
方法的定义
Xs.new(@length + 1) #
生成新对象
end
def <=>(other)
#
比较操作符的定义
@length <=> other.length
end
def to_s
sprintf "%2d #{inspect}", @length
end
def inspect
'x' * @length
end
end
r = Xs.new(3)..Xs.new(6)
#=> xxx..xxxxxx
r.to_a
#=> [xxx, xxxx, xxxxx, xxxxxx]
r.member?(Xs.new(5))
#=> true
前面的例子中,类
Xs
包括了
Comparable
模块。这是因为
Enumerable#member?
使用
==
操作符检查等同性
(equality)
。包括
Comparable
可确保
==
操作符在实现
<=>
方法的
Xs
中被定义。
Range
类的超为是
Object
,同时它也包含了模块
Enumerable
。
类方法:
(1)
Range.new(start, end, exclusive=false) => range
生成并返回一个从
start
到
end
间隔范围的
Range
对象。第三个参数若省略或为
false
,则
Range
对象包含终点
end
对象,否则,不包含终点
end
对象。生成对象时,会执行
start <=> end
操作以检查参数的合法性。若返回
nil
,则引发
ArgumentError
异常。
实例方法:
(1)
rng === obj => true or false rng.member?(val) => true or false
rng.include?(val) => true or false
若
val
在
Range
对象
rng
的范围内则返回真。
===
主要用在
case
句的比较中。
case 79
when 1..50
then
print "lown"
when 51..75
then
print "mediumn"
when 76..100 then
print "highn"
end
返回:
high
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
(2)
rng.first => obj
rng.begin => obj
rng.end => obj
rng.last => obj
返回
rng
中的
start
与
end
对象。
last
的返回值与
Range
对象是否包含范围的终点无关。
p (1..
5).end
# => 5
p (1...
5).end
# => 5
(3)
rng.exclude_end? => true or false
rng
对象不包含范围终点时返回真。
(4) rng.each {| i | block } => rng
在
rng
对象的每个元素上进行迭代操作,传递每个值到
block
块中。你只可以在
Range
对象范围内的对象支持
succ
方法时进行迭代。
(
这句话的意思是你不可以使用
Float
对象,因为它没有实现
succ
方法
)
。
Range#each
使用各元素的
succ
方法进行迭代操作。截止
1.6
版本为止,对
Numeric
对象一直采用的是算术运算。正因为作出了这个变更,所以不得不修改
Float
中的
Range
的处理方法。
(Float
没有
succ)
。
(10..15).each do |n|
print n, ' '
end
produces:
10 11 12 13 14 15
(5)
rng.step(n=1) {| obj | block } => rng
以
step
为步长对范围内的元素进行迭代操作。向
block
块传递每个
nth
元素。如果
Renge
对象的范围包含数字或字符串,则使用自然次序。否则
step
将调用
succ
方法来对范围内的元素进行迭代。
step
是正整数。默认值为
1
。
下面代码使用了前面的类
Xs
。
range = Xs.new(1)..Xs.new(10)
range.step(2) {|x| puts x}
range.step(3) {|x| puts x}
produces:
1 x
3 xxx
5 xxxxx
7 xxxxxxx
9 xxxxxxxxx
1 x
4 xxxx
7 xxxxxxx
10 xxxxxxxxxx
再如:
("a" .. "f").step(2) {|v| p v}
# => "a"
"c"
"e"
(6)
rng.to_s => string
rng.inspect => string
ruby 1.7
特性
:取消了
length
和
size
方法。若确实需要的话,可以这样
p ("a" .. "z").to_a.size
#=> 26
即可。
分享到:
相关推荐
### EXCEL VBA Range对象等基本操作应用实例详解 在Excel VBA编程中,`Range`对象是处理单元格数据的核心。它允许程序员访问和操纵Excel工作表中的单个单元格或一组单元格。以下是对标题和描述中提及的知识点的详细...
在Excel VBA编程中,Range对象是核心概念之一,它代表了Excel工作表中的一个或多个单元格。本文将深入探讨Range对象的基本操作及其在实际应用中的示例,旨在帮助初学者快速掌握这一重要工具。 一、Range对象的定义...
JavaScript 中的 Range 对象Range 对象允许您消除循环 (for/while/do=while) 循环。 在某种程度上,Array 对象可用于替换循环 (map,forEach),但这涉及初始化数组。 对于大循环,这可能很昂贵。 Range 允许您对一...
在Word VBA中的几种灵活设置Range对象的方法
#### 一、Range对象概述 在Excel VBA编程环境中,`Range`对象扮演着核心角色,它能够表示单个单元格、多行、多列乃至整个工作表中的任意选定区域。`Range`对象的灵活性和多功能性使其成为处理Excel数据时不可或缺的...
057.Python for循环结构_遍历各种可迭代对象_range对象.mp4
在Excel VBA编程中,Range对象是核心概念之一,它代表了Excel工作表中的一个或多个单元格。本章将深入探讨Range对象的属性、方法和事件,以及如何在VBA环境中有效地使用它们来实现自动化任务。以下是关于“第1章 ...
用Range对象的End属性求第一条空行的位置(作业).xlsm
使用场景:针对用户选中页面内容后,获取用户,选中部分的...`Range`对象表示一个包含节点与文本的文档片段,通常与`Selection`对象结合使用,`Selection`对象选中的文本选区所对应的文档片段,就是一个`Range`对象。
以下是个人对Range对象的了解和常用操作的实例和总结: Range对象 Range对象表示文档的连续范围区域,如用户在浏览器窗口中用鼠标拖动选中的区域。 dom标准Range对象 ...
”,“..”生成的范围对象包括起点和终点,“…”生成的范围对象不包括起点和终点,范围是由是一序列有顺序、有规律的元素对象组成,任何有顺序,有规律的一组对象,都可以用Range对象来定义,如数字、字母、字符串...
Range 对象是 Excel VBA 中最常用的对象之一,它可以是某一单元格、某一单元格区域、某一行、某一列、或者是多个连续或非连续的区域组成的区域。下面将介绍 Range 对象的一些属性和方法。 Range 对象的基本操作 ...
首先,Range对象代表了Excel工作表中的一个或多个单元格。它可以是一个单独的单元格,也可以是一行、一列或者由多个不连续的单元格组成的区域。以下是一些关于Range对象的基本操作: 1. **赋值给单元格**: 在VBA...
对象模型由多个层次的对象组成,包括Application对象、Workbook对象、Worksheet对象以及Range对象等。 **9.1 Excel VBA对象模型简介** Excel 2007 VBA对象模型直观地反映了Excel 2007程序的结构,允许开发者通过...
Python原来这么简单(win系统 提高篇)
Range对象代表了一个或多个单元格的集合,它可以是一个单独的单元格、一整行、一整列或者多个不连续的单元格区域。而Cells对象则是工作表上的特定单元格,通过行号和列号来定位。下面我们将详细探讨这两个对象的使用...