## 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.策略模式
- 赞助商
- 捐
- 人们怎么说
- 版权
- 取得这本书