携手创作,共同成长!这是我参与「掘金日新计划 · 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