Ruby 手册 | 20 - 区间 Range

176 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情

一、区间

Ruby 中区间表示对象集合的一种方式,区间通常用来表示一个连续的序列,序列中的元素可以是字符串也可以是数字或者自定义的对象等。

Ruby 中的区间使用 ..... 连起来的起点和重点,.. 表示的是一个闭合的区间,包括终点的值, ... 则表示半开半闭的区间(不包含终点值)。

1..3 # 表示 1,2,3
1...3 # 表示 1,2
a..d # 表示 a,b,c,d
a...d # 表示 a,b,c

区间在内部存储中只有起点和终点,因此相比数组更节省空间,当然区间也可以通过 to_a 方法转换成数组,显示全部值

puts (1..5).to_a.to_s # [1, 2, 3, 4, 5]

区间也可以使用 each 来进行遍历

(1..5).each {|i| puts i}

输出结果为:

1
2
3
4
5

区间的常用方法

区间是具有可枚举能力的数据类型,因此具有与 Enumerable 模块所以同的方法。比如在 上篇文章中共 Ruby 手册 | 18 - 枚举 中示例的那些方法。

除此之外,还有一些独有的方法:

  • rng.begin:获取第一个元素(对象)
  • rng.first:同 rng.first
  • rng.end:获取最后一个对象(元素)
  • rng.last:获取最后一个对象 同 rng.end

二、自定义区间

区间不仅可以表示连续的数字或者字符串序列,还可以自定义对象创建区间,自定义对象的区间需要为自定义的类实现 <==>succ 方法,其中 <==> 是运算符用来比较两个对象,返回 -1、0 或者 1;succ 方法这里用作返回序列中的下一个对象。

class WeekDay
  WEEKS = ["Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"]
  attr_accessor :weekdayValue

  def initialize(value)
    if WEEKS.include?(value)
      @weekdayValue = value
    end
  end

  def to_num
    WEEKS.index(@weekdayValue) if @weekdayValue
  end

  def <=>(other)
    self.to_num <=> other.to_num
  end

  def succ
    raise "week error" if self.to_num() > 7
    WeekDay.new(WEEKS[self.to_num() + 1])
  end

  def WeekDay(value)
    WeekDay.new(value)
  end

  def to_s
    @weekdayValue
  end
end
mons = WeekDay.new("Mon")
fris = WeekDay.new("Fri")
puts mons.succ
puts "#{mons}:#{mons.to_num()}"
puts fris.succ
puts "#{fris}:#{fris.to_num()}"
ra = (mons..fris)
ra.each { |week|
  puts week
}

执行上述代码,输出结果如下:

Tues
Mon:1
Sat
Fri:5
Mon
Tues
Wed
Thur
Fri