跳至內容

範圍

範圍 代表兩個值之間的間隔。它通常使用範圍字面值來建構,包含兩個或三個點

  • x..y:兩個點表示包含範圍,包含 xy 以及之間的所有值(數學表示:[x, y])。
  • x...y:三個點表示排除範圍,包含 x 和所有直到但不包含 y 的值(數學表示:[x, y))。
(0..5).to_a  # => [0, 1, 2, 3, 4, 5]
(0...5).to_a # => [0, 1, 2, 3, 4]

注意

範圍字面值通常會用括號括起來,例如,如果要用作呼叫的接收者。 沒有括號的 0..5.to_a 在語義上等同於 0..(5.to_a),因為方法呼叫和其他運算子的優先順序高於範圍字面值。

一個簡單記住哪個是包含範圍,哪個是排除範圍的方法,是將額外的點視為將 y 推得更遠,因此將其留在範圍之外。

字面值 x..y 在語義上等同於明確的建構子 Range.new(x, y),而 x...y 等同於 Range.new(x, y, true)

開始值和結束值不一定需要是相同的型別:true..1 是一個有效的範圍,儘管它非常無用,因為 Enumerable 方法無法使用不相容的型別。它們至少需要是可比較的。

nil 開頭的範圍稱為無始範圍,而以 nil 結尾的範圍稱為無終範圍。在字面值表示法中,可以省略 nilx.. 是從 x 開始的無終範圍,而 ..x 是以 x 結尾的無始範圍。

numbers = [1, 10, 3, 4, 5, 8]
numbers.select(6..) # => [10, 8]
numbers.select(..6) # => [1, 3, 4, 5]

numbers[2..] = [3, 4, 5, 8]
numbers[..2] = [1, 10, 3]

一個既無始又無終的範圍是有效的,可以表示為 .....,但通常不是很有用。