Range在概念上看是非常直观的。不过在实际的使用中,我们可能会遇到一些令人混淆的东西。

看如下代码:
digits = 0..9 #0到9
scale1 = 0..10 #0到10
scale2 = 0...10 #0到9,不包含10

..操作符将包含上限,而...不包含上限。

不过,Range不只是作用于数字类型,基本上对于任何的对象都有用,但结果是否有实际意义要看实际的情况了。
a = 'A'..'Z'
a.to_a.each{|c| puts c}

我们称..这样的Range为"关闭"的Range,而...的Range为"开放"的Range。

使用first和last方法(或同义方法begin和end),可以获取一个Range的开始和结束元素:
r1 = 3..6
r2 = 3...6
r1a, r1b = r1.first, r1.last # 3, 6
r1c, r1d = r1.begin, r1.end # 3, 6
r2a, r2b = r2.begin, r2.end # 3, 6 (注意:不是3和5)

exclude_end?方法可以得到Range是否排除上限项(即是否是...的Range)
r1.exclude_end? # false
r2.exclude_end? # true

对Range进行迭代
========================================================
Range是可迭代的,不过,为了更加实际有用,确认你的Range包含的对象已经有一个有意义的succ方法。
(3..6).each {|x| puts x }

我们看一个有趣的例子:
r1 = "7".."9"
r2 = "7".."10"
r1.each {|x| puts x } # 打印出7,8,9
r2.each {|x| puts x } # 未打印任何东西
为什么会出现这样的情况?这是因为这里都是字符串,由于r1中,"7"比"9"小,所以,它是个合理的Range;而表达式r2中,
"7"比"10"大,下限大于了上限,就不合理了。

浮点数的Range可以进行迭代么?我们来看一下:
fr = 2.0..2.2
fr.each {|x| puts x } # 错误!
为什么浮点数不可以迭代呢?因为浮点数对象没有succ方法。是因为不能实现么?理论上,这是没有问题的,但是,实际上,如果浮点数
Range迭代,这有可能出现:很小的一个范围,将产生非常庞大的迭代量。这对语言的实现有非常高的要求。况且,这样的功能,极少有用到。

测试范围关系
===========================================================
include?方法(同义方法member?)可以判断一个值是否处在当前的Range中:
r1 = 23456..34567
x = 14142
y = 31416
r1.include?(x) # false
r1.include?(y) # true
它内部是怎么实现的呢?其实,它只是把给出的值和该Range的上限做比较得出的(所以,它依赖与一个有意义的<=>)。

转化为数组
============================================================
很简单,to_a方法搞定:
r = 3..12
arr = r.to_a # [3,4,5,6,7,8,9,10,11,12]

反向的Range
=============================================================
我们前面讨论过了下限大于上限的Range,如:
r = 6..3
x = r.begin # 6
y = r.end # 3
flag = r.end_excluded? # false
它确实是个合法的Range,但是,它包含的内容缺并不是我们想像的那样:
arr = r.to_a # 得到空的数组[]
r.each {|x| p x} # 无结果
r.include?(5) # false

那么说反向Range是没有什么用处的咯?那倒不是,我们可以在字符串和数组中使用反向Range:
string = "flowery"
str1 = string[0..-2] # "flower"
str2 = string[1..-2] # "lower"
str3 = string[-5..-3] # "owe" (其实这是个正向的Range)

转载于:https://blog.51cto.com/zorro/864240

Ruby的Range类相关推荐

  1. 【TODO】Ruby Range类

    创建: 2017/10/28 Range类                                                                               ...

  2. java range类_Java即时类| range()方法与示例

    java range类 即时类range()方法 (Instant Class range() method) range() method is available in java.time pac ...

  3. opencv中Range类的使用

    #include<iostream> #include<opencv2/opencv.hpp> #include<vector> using namespace s ...

  4. Ruby中的类与对象(一)

    一些约定: 类名首字母大写 方法名首字母小写 end在Ruby中无处不在. 声明类 class BookInStock end 创建类对象 a_book = BookInStock.new anoth ...

  5. Ruby之Enumerator类

    今天发现了Ruby1.8.6和 Ruby1.9.2的一个不同之处,试运行以下代码: require 'find'puts Find.find("./data").class 在Ru ...

  6. C# Excel.Range类实现对Excel单元格文本格式的设置

    Excel.Range titleRange_A = newWorksheet.get_Range(newWorksheet.Cells[2, 2], newWorksheet.Cells[2, 2] ...

  7. [自定义区间-Range]书里的例子 - 中文数字类

    class ChineseNumberNumbers = ["一","二","三","四","五", ...

  8. ruby 变量类中范围_Ruby中的类

    ruby 变量类中范围 Ruby类 (Ruby Classes) In the actual world, we have many objects which belong to the same ...

  9. [Ruby编程语言].弗拉纳根_松本行弘读书笔记

    Ruby is Object-Oriented, Ruby是一门完全的面向对象语言.Ruby里的每个值都是对象 迭代器(iterator)行为类似于循环,包含在花括号中的代码称为代码块(block), ...

最新文章

  1. 数字货币支付能成为主流吗?
  2. 2015 Multi-University Training Contest 1 - 10010 Y sequence
  3. log4j 超完美配置文件!
  4. 防盗链测试01 - Jwplayer+Tengine2.3.1 mp4模块打造流媒体测试服务器
  5. Delphi程序的主题(Theme)设置
  6. MVC是一种用于表示层设计的复合设计模式
  7. 检测和测试停滞的流– RxJava常见问题解答
  8. Axiom3D:Ogre射线与点,线,面相交,鼠标操作3维空间.
  9. 官方个人免签系统网站源码柒上支付聚合三方四方支付系统
  10. 消防工程师 8.2 防排烟系统-防烟
  11. 如何用PS(photoshop)给照片加文字
  12. 强势增长的中国半导体封装企业,已站在“起跑线”上
  13. 上海理想胡忠顺:聚焦双纬度,剑指智慧化实践
  14. 快速替换修改代码快捷键
  15. Win7 获取管理员权限
  16. 一证通查查询名下互联网账户
  17. python新建文件夹和文件夹_Python创建文件夹与文件的快捷方法
  18. 城市规划图例符号_城市规划设计图层图例
  19. Adobe国际认证证书通过率
  20. FLUTTER学习笔记--布局

热门文章

  1. 详细分析开源软件项目 Ajax.NET Professional 中的RCE 漏洞(CVE-2021-23758)
  2. 奇安信专家:近八成软件存开源漏洞 供应链需全生命周期安全防护
  3. 邮件安全上市公司 Mimecast 的部分源代码被 SolarWinds 黑客盗走
  4. 《从0到1学习Flink》—— Flink parallelism 和 Slot 介绍
  5. 《Getting Started with WebRTC》第二章 WebRTC技术介绍
  6. centos 实现ssh远程连接docker
  7. JAVA 微信支付 native方式
  8. Debian 7 Gitlab `GLIBC_2.14 not found`
  9. Google Play市场考察报告-2
  10. Linux系统中网络配置详解(一)