红宝石 |控制流变更
先决条件:决策,循环
除了循环、条件和迭代器之外,Ruby 编程语言还提供了一些语句,用于更改程序中的控制流。
换句话说,这些语句是一段代码,一个接一个地执行,直到条件为真,当条件变为假时,代码终止。以下是可以改变 Ruby 程序中控制流的语句:
- 中断语句
- 下一个声明
- 重做语句
- 重试语句
- 退货声明
- 抛出/捕获语句
中断语句
在 Ruby 中,Break 语句用于在条件为真时退出循环。 Break 语句基本上用在while循环中,因为在 while 循环中,输出被打印,直到条件为真,当条件为假时,循环退出。 break 语句在循环内部使用。 break 语句由break关键字执行。 Break 语句也可用于for 、 while和case控制语句。
句法:
break
例子:
# Ruby program to illustrate break statement
#!/usr/bin/ruby
i = 1
# using while loop
while true
if i * 6 >= 30
# using break statement
break
# ending of if statement
end
puts i * 6
i += 1
# ending of while loop
end
输出:
6
12
18
24
说明:在上面的例子中,当条件if i * 6 >= 30 为真时, break语句用于停止 while 循环的执行。否则循环进入无限。
下一条语句
在 Ruby 中, next语句用于跳转到给定循环的下一个迭代器。 next 语句与 C 和Java语言中的continue语句相同。当使用下一条语句时,不会执行其他迭代。一般在for和while循环中使用 next 语句。
句法:
next
例子:
# Ruby program to illustrate next statement
#!/usr/bin/ruby
# using for loop
for t in 0...10
# using if statement
if t == 5 then
# using next statement
next
# ending of if
end
# displaying values
puts t
# end of for loop
end
输出:
0
1
2
3
4
6
7
8
9
解释:在上面的程序中,由于下一条语句,输出中不会打印 5。所以这里在 5下一条语句将导致跳过它并从程序中的下一条语句继续。
重做语句
redo 语句用于重新启动循环或迭代器的当前迭代。 redo 和 next 语句是有区别的。 next 语句总是将控制权转移到循环的末尾,循环之后的语句可以开始执行,但 redo 语句将控制权转移回块或循环的顶部,以便迭代可以重新开始。
句法:
redo
例子:
# Ruby program to demonstrate the redo statement
# defining a variable
val = 0
# using while loop which should give
# output as 0,1,2,3 but here it will
# output as 0,1,2,3,4
while(val < 4)
# Control returns here when
# redo will execute
puts val
val += 1
# using redo statement
redo if val == 4
# ending of while loop
end
输出:
0
1
2
3
4
解释:在上面的程序中, redo语句将控制权转移到puts val上,它是while循环的第一个表达式。它既不会重新测试循环条件,也不会从迭代器中获取下一个元素。因此,这里的while循环将打印0,1,2,3,4而不是0,1,2,3 。
retry 语句(在最近的版本中已弃用)
retry语句用于根据某个条件或从头开始的任何方法调用来重新启动迭代器。简而言之,重试语句在开始时转移控制权。通常,很少使用重试语句。它只能工作到Ruby 版本 1.8 。
注意:重试语句已从 Ruby 版本 1.9 开始删除,因为它被视为已弃用的语言功能。所以它几乎不会在在线 IDE 上运行,因为主要使用1.8 以上的版本。
句法:
retry
例子:
# Ruby program to demonstrate the retry statement
# variable
var = 7
# Iterate 7 times from 0 to 7-1
var.times do |val|
# display iteration number
puts val
# If we've reached 6
if val == 6
# Decrement val and user won't
# reach 6 next time
var = var - 1
# Restart the iteration
# using retry statement
retry
# end of if
end
# end of do..end
end
输出:
0
1
2
3
4
5
6
0
1
2
3
4
5
说明:在上面的程序中,当控制进入重试语句时,它会将控制转移到var.times do |val| .现在这里 var 变量的值被更新,即5 。因此用户下次不会达到 6 并且重试语句将不会再次执行。
退货声明
这用于退出一个方法,有或没有一个值。它总是向调用者返回一个值。 return 语句有很多选项。如果没有与 return 语句一起使用的表达式,那么它总是将方法的值返回为 nil。 return 语句后的表达式列表始终由逗号 (,)分隔。在这种情况下,方法的值将是一个包含那些指定表达式的值的数组。
例子:
# Ruby program to demonstrate the return statement
#!/usr/bin/ruby
# defining a method 'geeks'
def geeks
# variables of method
val1 = 61
val2 = 55
# returning multiple values
return val1, val2
# this statement will not execute
puts "Hello Geeks"
# end of the method
end
# variable outside the method to
# store the return value of the method
value = geeks
# displaying the returned values
puts value
输出:
55
61
说明:在上面的例子中,方法geeks有一个 return 语句,它返回两个值,即val1和val2给它的调用者。这里的 value 是存储返回值的变量。重要的一点是,将“Hello Geeks”放在return 语句之后的语句不会执行,因为return 语句之后的语句不会在方法内执行。
throw/catch 语句
throw和catch用于定义可以被视为多级中断的控制结构。 throw用于中断当前循环并将控制转移到catch块之外。 throw最好的一点是它可以跳出当前的循环或方法,或者我们可以说它可以跨越任意数量的级别。在这里, catch定义了一个“标记块”代码,它会导致 throw 块退出。更多细节将在 Ruby 异常处理部分讨论。
例子:
# Ruby program to illustrate the throw/catch statement
# for altering the control flow
# defining a method
def lessNumber(num)
# using throw statement
# here 'numberError' is its label
throw :numberError if num < 10
# displaying result
puts "Number is Greater than 10!"
end
# catch block
catch :numberError do
# calling method
lessNumber(11)
lessNumber(78)
# exits catch block here
lessNumber(7)
lessNumber(4)
end
puts "Outside Catch Block"
输出:
Number is Greater than 10!
Number is Greater than 10!
Outside Catch Block
说明:在上面的程序中, 11被传递给方法lessNumber来检查它是否大于 10。 11 大于 10,因此语句将在显示屏上打印出来,并且catch块的下一条语句将执行。现在78被传递给方法调用,它被检查并且大于 10,因此语句将在屏幕上打印出来。但是一旦通过小于 10 的 7 throw: numberError导致 catch 块退出并且所有语句都跳过并且最后一条语句“Outside Catch Block”将打印出来。因此,一旦条件变为假, throw就会导致catch块从执行中退出 catch 块。