區間 代表兩個值之間的間隔。
最常支援區間的型別是Integer和String。
它們可以用在很多地方,例如快速建立集合、切割字串、檢查某個值是否落在區間內,以及疊代。
建立區間時使用區間運算子..或...(分別代表包含結尾值與不包含結尾值)。
1..5 # => 1..5
1...5 # => 1...5
(1..5).to_a # => [1, 2, 3, 4, 5]
(1...5).to_a # => [1, 2, 3, 4]
之所以有兩個區間運算子,是為了讓你能建立包含或不包含結尾值的區間,這在處理以 0 為基準的索引時特別有用。
也可以用Range初始化方法來建立區間。
Range.new(1, 5) # A range containing 1, 2, 3, 4, 5
在 Ruby 中用區間運算子..或...建立區間後,如果想在該區間上呼叫方法,必須用括號把區間包起來。
否則方法會被當成區間運算子的第二個引數來呼叫。
(1..5).sum # => 15
1..5.sum # => Error: undefined method `sum' for 5:Integer (NoMethodError)
想切割字串時,可以用區間運算子取得子字串,也就是用子字串的起始與結束索引建立一個區間。
"Hello World"[0..4] # => "Hello"
"Hello World"[6..10] # => "World"
也可以使用負索引,從字串尾端取得子字串。
"Hello World"[-5..-1] # => "World"
"Hello World"[6..-4] # => "Wo"
區間確實有一組方法可以用來操作它們。 例如,你可以用這些方法取得區間中所有值的總和,或檢查區間是否包含某個值。
| 方法 | 說明 | 範例 |
|---|---|---|
sum |
回傳區間中所有值的總和 | (1..5).sum # => 15 |
size |
回傳區間的大小 | (1..5).size # => 5 |
include? |
如果區間包含指定的值就回傳true,否則回傳false
|
(1..5).include?(3) # => true |
區間可以是無盡的,也可以是無起始的。
無盡或無起始的區間,其起始值或結尾值是nil,但在定義區間時可以省略nil。
當你想從頭或到尾切割字串時,使用無起始與無盡區間就很方便。
"Hello World"[0..] # => "Hello World"
"Hello World"[4..] # => "o World"
"Hello World"[..5] # => "Hello "
如果沒有套用在集合上,無盡區間若不謹慎使用,可能會產生無盡的序列。
字串也可以用在區間中,讓你能取得兩個字串之間的一連串字串。 使用某些字串時,它的行為可能會有點出乎意料,所以要謹慎使用。
"aa".."az".to_a # => ["aa", "ab", "ac", ..., "az"]
Ruby 允許你在區間中使用自訂物件。 前提是該物件必須實作以下項目:
Comparable模組succ方法<=>方法有了這些方法,區間才能疊代該物件,並比較區間中的物件。
class Foo
include Comparable
attr_reader :value
def initialize(value)
@value = value
end
def succ
Foo.new(value + 1)
end
def <=>(other)
value <=> other.value
end
end
(Foo.new(1)..Foo.new(5))
# => #<Foo:0x7f3552bebe70 @value=1>, #<Foo:0x7f3552bebe50 @value=2>, #<Foo:0x7f3552bebe40 @value=3>, #<Foo:0x7f3552bebe30 @value=4>, #<Foo:0x7f3552bebe20 @value=5>