範圍¶
範圍 代表兩個值之間的間隔。它通常使用範圍字面值來建構,包含兩個或三個點
x..y
:兩個點表示包含範圍,包含x
和y
以及之間的所有值(數學表示:[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
結尾的範圍稱為無終範圍。在字面值表示法中,可以省略 nil
:x..
是從 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]
一個既無始又無終的範圍是有效的,可以表示為 ..
或 ...
,但通常不是很有用。