## 8.范圍
有時,例如在評分系統中,我們需要具有一定范圍的值。 如果學生的分數從 60 到 100,則他的成績為 A,從 50 到 59 的成績為 B,依此類推。 每當我們需要處理一系列值時,我們都可以在 Ruby 中使用范圍。 在終端中輸入`irb --simple-prompt`并將其輸入
```rb
>> (1..5).each {|a| print "#{a}, " }
```
輸出量
```rb
1, 2, 3, 4, 5, => 1..5
```
好,上面的語句中的`(1..5)`是什么,這稱為范圍。 范圍是一個具有上限值和下限值以及介于兩者之間的所有值的對象。 請注意,像數組一樣,可以使用`each`方法得出范圍內的每個值,如上所示。
范圍不僅僅適用于數字,還可以適用于字符串,如下所示
```rb
>> ("bad".."bag").each {|a| print "#{a}, " }
```
Output
```rb
bad, bae, baf, bag, => "bad".."bag"
```
讓我們嘗試一下 irb 中的其他一些例子,這些例子會告訴我們更多有關 Ranges 的信息。 因此,啟動你的 irb 并輸入以下內容
```rb
>> a = -4..10
```
Output
```rb
=> -4..10
```
在上面的代碼片段中,我們創建了一個范圍為值-4 到 10 的范圍。要檢查`a`屬于哪種類型,請找出它是什么類
```rb
>> a.class
```
Output
```rb
=> Range
```
我們可以看到一個屬于`Range`類
要獲得某個范圍內的最大值,請使用`max`方法,如下所示
```rb
>> a.max
```
Output
```rb
=> 10
```
要獲得范圍內的最小值,請使用`min`方法,如下所示
```rb
>> a.min
```
Output
```rb
=> -4
```
可以使用`to_a`方法將范圍轉換為數組,如下所示
```rb
>> a.to_a
```
Output
```rb
=> [-4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```
### 8.1。 范圍,以防.. when
查看下面的程序( [range_case_when.rb](code/ranges_case_when.rb) ),我們正在構建一個學生評分系統,其中當輸入一個分數時,該程序將計算學生的成績,研究代碼,鍵入并執行它 ,我們很快就會看到它是如何工作的。
```rb
#!/usr/bin/ruby
# ranges_case_when_19.rb
puts "Student grading system"
print "Enter student mark: "
mark = gets.chop.to_i
grade = case mark
when 80..100
'A'
when 60..79
'B'
when 40..59
'C'
when 0..39
'D'
else
"Unable to determine grade. Try again."
end
puts "Your grade is #{grade}"
```
Output
```rb
Enter student mark: 72
Your grade is B
```
首先,程序打印出該軟件是學生評分系統,并要求用戶輸入學生評分。 當使用`gets`語句輸入標記時,使用`chop`方法將尾隨換行符截斷,并使用`to_i`方法將其轉換為整數,并將標記存儲在變量標記中。 所有這些都使用此`mark = gets.chop.to_i`語句完成。
有了標記后,我們需要將其與一系列值進行比較以確定使用以下語句完成的等級:
```rb
grade = case mark
when 80..100 : 'A'
when 60..79 : 'B'
when 40..59 : 'C'
when 0..39 : 'D'
else "Unable to determine grade. Try again."
end
```
在這里,我們看到標記被傳遞到 case 語句。 在`when`中,沒有用于比較`mark`的數字或字符串,實際上我們有范圍。 當分數從 80 到 100(含兩端)時,等級設置為`A`,當分數在 60 至 79 時,等級設置為`B`,對于`C`設置為 40 至 59,對于`D`設置為 0 至 39。 。如果用戶輸入錯誤,則等級將設置為`"Unable to determine grade. Try again."`。
因此,正如我們看到的那樣,將范圍與`case when`語句一起使用時非常方便。 與其他語言相比,它使編程相對簡單。
### 8.2。 檢查間隔
Ranges 的另一種用途是檢查是否有任何東西位于特定的時間間隔內。 考慮下面的程序( [range_cap_or_small.rb](code/ranges_cap_or_small.rb) )
```rb
#!/usr/bin/ruby
# ranges_cap_or_small.rb
print "Enter any letter: "
letter = gets.chop
puts "You have entered a lower case letter" if ('a'..'z') === letter
puts "You have entered a upper case letter" if ('A'..'Z') === letter
```
Output
```rb
Enter any letter: R
You have entered a upper case letter
```
仔細閱讀并執行。 在上述情況下,我輸入了大寫字母`R`,因此程序顯示我輸入了大寫字母。 如果我輸入了小寫字母,程序會說我輸入了小寫字母。 讓我們看看程序如何工作。 以下幾行:
```rb
print "Enter any letter: "
letter = gets.chop
```
提示用戶輸入字母,當用戶輸入字母時,`gets`方法得到它,`chop`截斷由于我們按下 Enter 鍵而添加的新行字符。 在下一行中查看`if ('a'..'z') === letter`,在這里我們檢查變量字母中的值是否位于`'a'`和`'z'`(包括兩者)中,如果包含,則打印用戶輸入的小寫字母。 請注意,如果 letter 中包含大寫字母,并且程序打印用戶輸入了大寫字母,則我們不使用等于`== `but we use triple equal to `===`<sup class="footnote">[[27](#_footnotedef_27 "View footnote.")]</sup> to check if its in range. In a similar way `('A'..'Z') ===`的 double 字母返回 true。
### 8.3。 使用三點...
我想添加的范圍中的另一件事是使用三點而不是使用雙點。 只需在 irb 上嘗試這些即可。
```rb
>> (1..5).to_a
=> [1, 2, 3, 4, 5]
>> (1...5).to_a
=> [1, 2, 3, 4]
```
從上面的代碼片段中可以看到,當我鍵入`(1..5).to_a`時,我們得到的數組輸出為`[1, 2, 3, 4, 5]`,但是對于`(1…?5).to_a`,我們得到的輸出為`[1, 2, 3, 4]`。 三點忽略范圍內的最后一個值。
### 8.4。 無盡的范圍
Ruby 有無限的范圍,也就是說你可以編寫這樣的程序
```rb
#!/usr/bin/ruby
# ranges_cap_or_small.rb
print "Enter any letter: "
letter = gets.chop
puts "You have entered a lower case letter" if ('a'..'z') === letter
puts "You have entered a upper case letter" if ('A'..'Z') === letter
```
運行程序會產生以下輸出
```rb
Enter your age: 32
You are grownup
```
在上面的執行中,我將年齡定為 32 歲,因此涉及代碼的這一部分
```rb
when (19..)
puts "You are grownup"
```
在其中查看`(19..)`,這里表示 19 及其上方的任何值。 請注意,我們未指定`when 19..`,因為這會混淆 Ruby 解釋器并拋出錯誤。
- 前言
- 紅寶石
- 先決條件
- 1.安裝 Ruby
- 2.在線資源
- 3.入門
- 4.比較與邏輯
- 5.循環
- 6.數組
- 7.哈希和符號
- 8.范圍
- 9.功能
- 10.可變范圍
- 11.類&對象
- 12.安全導航
- 13.打破大型程序
- 14.結構和 OpenStruct
- 15. Rdoc
- 16. Ruby 樣式指南
- 17.模塊和混入
- 18.日期和時間
- 19.文件
- 20. Proc,Lambda 和塊
- 21.多線程
- 22.異常處理
- 23.正則表達式
- 24.寶石
- 25.元編程
- 26.基準
- 27.測試驅動開發
- 28.觀察者模式
- 29.模板模式
- 30.工廠模式
- 31.裝飾圖案
- 32.適配器模式
- 33.單例模式
- 34.復合模式
- 35.建造者模式
- 36.策略模式
- 贊助商
- 捐
- 人們怎么說
- 版權
- 取得這本書