區間

區間 在 Ruby

1 個練習

關於 區間

區間 代表兩個值之間的間隔。 最常支援區間的型別是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
Note

在 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 "
Caution

如果沒有套用在集合上,無盡區間若不謹慎使用,可能會產生無盡的序列。

字串區間

字串也可以用在區間中,讓你能取得兩個字串之間的一連串字串。 使用某些字串時,它的行為可能會有點出乎意料,所以要謹慎使用。

"aa".."az".to_a # => ["aa", "ab", "ac", ..., "az"]

在區間中使用自訂物件

Advanced

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>
透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 區間