`
qzriso
  • 浏览: 242281 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

Range对象

阅读更多

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 VBA编程中,`Range`对象是处理单元格数据的核心。它允许程序员访问和操纵Excel工作表中的单个单元格或一组单元格。以下是对标题和描述中提及的知识点的详细...

    Excel VBA Range对象等基本操作应用示例

    在Excel VBA编程中,Range对象是核心概念之一,它代表了Excel工作表中的一个或多个单元格。本文将深入探讨Range对象的基本操作及其在实际应用中的示例,旨在帮助初学者快速掌握这一重要工具。 一、Range对象的定义...

    Range:Javascript 的 Range 对象

    JavaScript 中的 Range 对象Range 对象允许您消除循环 (for/while/do=while) 循环。 在某种程度上,Array 对象可用于替换循环 (map,forEach),但这涉及初始化数组。 对于大循环,这可能很昂贵。 Range 允许您对一...

    Word VBA中设定Range的几种方法.txt

    在Word VBA中的几种灵活设置Range对象的方法

    057.Python for循环结构_遍历各种可迭代对象_range对象.mp4

    057.Python for循环结构_遍历各种可迭代对象_range对象.mp4

    第1章 Range(单元格)对象

    在Excel VBA编程中,Range对象是核心概念之一,它代表了Excel工作表中的一个或多个单元格。本章将深入探讨Range对象的属性、方法和事件,以及如何在VBA环境中有效地使用它们来实现自动化任务。以下是关于“第1章 ...

    用Range对象的End属性求第一条空行的位置(作业).xlsm

    用Range对象的End属性求第一条空行的位置(作业).xlsm

    Web APIs 之 Selection对象和Range对象的基本使用

    使用场景:针对用户选中页面内容后,获取用户,选中部分的...`Range`对象表示一个包含节点与文本的文档片段,通常与`Selection`对象结合使用,`Selection`对象选中的文本选区所对应的文档片段,就是一个`Range`对象。

    javascript Range对象跨浏览器常用操作第1/2页

    以下是个人对Range对象的了解和常用操作的实例和总结: Range对象 Range对象表示文档的连续范围区域,如用户在浏览器窗口中用鼠标拖动选中的区域。 dom标准Range对象 ...

    Ruby中的Range对象学习笔记

    ”,“..”生成的范围对象包括起点和终点,“…”生成的范围对象不包括起点和终点,范围是由是一序列有顺序、有规律的元素对象组成,任何有顺序,有规律的一组对象,都可以用Range对象来定义,如数字、字母、字符串...

    ExcelVBA中的Range和Cells用法说明.docx

    Range 对象是 Excel VBA 中最常用的对象之一,它可以是某一单元格、某一单元格区域、某一行、某一列、或者是多个连续或非连续的区域组成的区域。下面将介绍 Range 对象的一些属性和方法。 Range 对象的基本操作 ...

    Excel RANGE&CELLS用法详解

    首先,Range对象代表了Excel工作表中的一个或多个单元格。它可以是一个单独的单元格,也可以是一行、一列或者由多个不连续的单元格组成的区域。以下是一些关于Range对象的基本操作: 1. **赋值给单元格**: 在VBA...

    ExcelVBA对象模型和应用程序对象.pdf

    对象模型由多个层次的对象组成,包括Application对象、Workbook对象、Worksheet对象以及Range对象等。 **9.1 Excel VBA对象模型简介** Excel 2007 VBA对象模型直观地反映了Excel 2007程序的结构,允许开发者通过...

    37第十三回:zip函数轻松合并列表,range对象竟然无视内存.mp4

    Python原来这么简单(win系统 提高篇)

    ExcelVBA中的Range和Cells用法说明.pdf

    Range对象代表了一个或多个单元格的集合,它可以是一个单独的单元格、一整行、一整列或者多个不连续的单元格区域。而Cells对象则是工作表上的特定单元格,通过行号和列号来定位。下面我们将详细探讨这两个对象的使用...

Global site tag (gtag.js) - Google Analytics