天天看點

Ruby 範圍(Range)

範圍(Range)無處不在:a 到 z、 0 到 9、等等。Ruby 支援範圍,并允許我們以不同的方式使用範圍:

作為序列的範圍

作為條件的範圍

作為間隔的範圍

範圍的第一個也是最常見的用途是表達序列。序列有一個起點、一個終點和一個在序列産生連續值的方式。

Ruby 使用 <b>''..''</b> 和 <b>''...''</b> 範圍運算符建立這些序列。兩點形式建立一個包含指定的最高值的範圍,三點形式建立一個不包含指定的最高值的範圍。

(1..5) #==&gt; 1, 2, 3, 4, 5

(1...5) #==&gt; 1, 2, 3, 4

('a'..'d') #==&gt; 'a', 'b', 'c', 'd'

序列 1..100 是一個 Range 對象,包含了兩個 Fixnum 對象的引用。如果需要,您可以使用 to_a 方法把範圍轉換為清單。嘗試下面的執行個體:

#!/usr/bin/ruby

$, =", " # Array 值分隔符

range1 = (1..10).to_a

range2 = ('bar'..'bat').to_a

puts "#{range1}"

puts "#{range2}"

以上執行個體運作輸出結果為:

範圍實作了讓您可以周遊它們的方法,您可以通過多種方式檢查它們的内容:

# -*- coding: UTF-8 -*-

# 指定範圍

digits = 0..9

puts digits.include?(5)

ret = digits.min

puts "最小值為 #{ret}"

ret = digits.max

puts "最大值為 #{ret}"

ret = digits.reject {|i| i &lt; 5 }

puts "不符合條件的有 #{ret}"

digits.each do |digit|

puts "在循環中 #{digit}"

end

範圍也可以用作條件表達式。例如,下面的代碼片段從标準輸入列印行,其中每個集合的第一行包含單詞 start,最後一行包含單詞 end.:

while gets

print if /start/../end/

範圍可以用在 case 語句中:

score = 70

result = case score

when 0..40

"糟糕的分數"

when 41..60

"快要及格"

when 61..70

"及格分數"

when 71..100

"良好分數"

else

"錯誤的分數"

puts result

範圍的最後一個用途是間隔檢測:檢查指定值是否在指定的範圍内。需要使用 === 相等運算符來完成計算。

if ((1..10) === 5)

puts "5 在 (1..10)"

if (('a'..'j') === 'c')

puts "c 在 ('a'..'j')"

if (('a'..'j') === 'z')

puts "z 在 ('a'..'j')"