💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 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 解释器并抛出错误。