`
zarknight
  • 浏览: 146581 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Ruby的Range类

阅读更多
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)


 

分享到:
评论

相关推荐

    ruby语法基础教程

    ruby语法基础教程,比较全的。 目 录 Ruby语言 1 Grant Ren 1 第一部分 Ruby语言基础 8 第一章 Ruby语言概述 8 §1.1 Ruby的历史 8 §1.2 Ruby名字的由来 8 §1.3 Ruby的特点 8 §1.4 Ruby和Python的比较 9 第二章...

    win32ole_ruby

    worksheet.Range('A1:D1').value = ['North','South','East','West']; As this sample, You can convert your VBA macro to Ruby script easily. -------------------------------------------------------------...

    Ruby中的Range对象学习笔记

    Range是范围对象的类,定义的时候可以使用范围操作符“..”或者“…”,“..”生成的范围对象包括起点和终点,“…”生成的范围对象不包括起点和终点,范围是由是一序列有顺序、有规律的元素对象组成,任何有顺序,...

    opening_range_breakout:ruby和python中的开放范围突破建模

    opening_range_breakout:ruby和python中的开放范围突破建模

    ranger:#to_range 方法用于 ruby​​ 字符串

    Ranger 为 ruby​​ 字符串添加了一个#to_range方法,因此您可以像"1..3".to_range一样执行"1..3".to_range .to_range。 安装 将 gem 添加到 Gemfile 并捆绑: gem 'ranger' 或者自己安装: $ gem install ...

    flow-ruby:用于Flow API的Ruby包装器

    需要注意的一些事情: #send_transaction #get_events_for_height_range和#get_events_for_block_ids #get_latest_protocol_state_snapshot测试!!!安装将此行添加到您的应用程序的Gemfile中: gem 'flow-ruby'...

    setup-ruby:使用特定版本的Ruby设置GitHub Actions工作流程

    设置Ruby 请注意:此操作已弃用,不应再使用。...用法参见 基本的: steps :- uses : actions/checkout@v2- uses : actions/setup-ruby@v1 with : ruby-version : ' 2.6 ' # Version range or exact version of a Rub

    ipcat-ruby:client9ipcat的Ruby端口

    ipcat-ruby 库的ruby端口,用于对来自已知数据中心的IP地址进行分类 安装 使用捆绑器: # In Gemfile gem 'ipcat' 或与Ruby: gem install ipcat 用法 IPCat . datacenter? ( ip_address ) 如果ip_address来自...

    to_range:将可解析字符串转换为 Ruby 范围对象的小型 Rub​​y Gem

    Ruby Gem 将字符串(可解析)转换为 Range 对象 用法 irb(main):001:0&gt; "1..10".to_range =&gt; 1..10 =&gt; PROFIT! 对于任何不明确的情况,一个可能的范围可能有多个匹配,这个库假设你只需要第一个可能的,看起来有效...

    Continuous Testing: With Ruby, Rails, and JavaScript

    He is a frequent speaker at software conferences and has written many articles on a range of software development topics including agility, enterprise software development, and semantics.

    Ruby创建“关键字”同名方法别名的方法

    begin和end是ruby的关键字,但是Range中也有名称为begin和end的实例方法。现在问题来了:怎么创建它们的别名方法? 如果用class Range;alias begin_x begin end是不行的,ruby以为后面一个begin是某个语法块的开头啊...

    segment_tree:段树数据结构的Ruby实现,用于存储间隔。 它允许查询哪些存储段包含给定点

    段树 Ruby实现数据结构。 段树是用于存储间隔或段的树数据结构。 它允许查询哪些存储段包含给定点。...段树由段(在Ruby中为Range对象)和相应的值组成。 构建段树的最简单方法是从以段为键的哈希值创建它:

    ish:用于生成接近数字 ex 的随机数的 Ruby 助手

    当需要随机的“模糊”数字/时间结果时,Ish 是一颗Ruby。 一些快速示例: # integers always return integers 100 . ish # =&gt; 99 100 . ish # =&gt; 104 # the default precision is 0.05, meaning the plus/minus ...

    interval-tree:居中间隔树的Ruby实现

    间隔树Ruby 中居中区间树算法的实现。也可以看看变更日志2020-11-09,由 、 和贡献当提供较大范围的搜索查询时,可以大大改善性能。2017-05-12,贡献用户可以在搜索中指定一个选项unique: false如果他/她想要返回多...

    ruby-interval_set:一套Ruby范围

    间隔集 IntervalSet实现一组排序的不重叠范围。 范围的开始始终被解释为包含性,而结束则被排除。安装将此行添加到您的应用程序的Gemfile中: gem 'interval_set' 然后执行: $ bundle或将其自己安装为: $ gem ...

    Javascript-range-function

    在Ruby中,如果我们要从2个点(-2、2)生成一个Array,我们只需要 ( - 2 .. 2 ) . to_a #=&gt; [-2, -1, 0, 1, 2] 但是在JS中,我们需要从头开始构建一个函数。 所以这是函数: function range ( start , stop ) { ...

    js-iterators:JS中的Ruby样式迭代器

    js-iterators(零依赖) JS中的Ruby样式迭代器。 JS中的Ruby样式范围[ ... 1. . _10 ] ; // [1, 2, 3, 4, 5, 6, 7, 8, 9][ ... 1. . _ - 10 ] ; // [1, 0, -1, -2, ..., -9][ ... Math . PI . _9 ] ; // [3....

    模型类方法实验室v-000

    使用活动记录的最佳查询 学习目标 使用ActiveRecord的AREL库来构建优化的查询 介绍 在编程中,一个很好的准则是: 使用最佳工具完成工作 例如,您不想使用JavaScript来构建... 通过使用RUBY使用Ruby的range方法(

    模型类方法实验室SF网络091619

    使用活动记录的最佳查询 学习目标 使用ActiveRecord的AREL库来构建优化的查询 介绍 在编程中,一个很好的准则是: 使用最佳工具完成工作 例如,您不想使用JavaScript来构建... 通过使用RUBY使用Ruby的range方法(

Global site tag (gtag.js) - Google Analytics