什么是循环?
我们可以把循环解释为一遍又一遍地重复同一事物的行为。在编程中,正如在现实生活中,我们需要流水线。想象一下,一个蛋糕工厂有一个确定的流程:混合原料、烘烤蛋糕、拆模、倒糖霜、包装蛋糕。这个过程每天都要进行100次。如果工厂的活动被翻译成代码,并且这个过程被定义在一个叫做 "cake_process "的方法中,我们就可以按照下面的方法对每一天进行编程。
# DAY 1
cake_process()
cake_process()
...
# continue 97 times
...
cake_process()
或者我们可以做一些更简单的事情,在烘烤方法中循环100次。
# DAY 1
100.times do
cake_process()
end
红宝石循环
循环是面向对象编程语言中的一个关键概念,根据接口数据创建实例是反复进行的。换句话说,循环是一个能够通过对象进行迭代的功能,如通过数组循环或通过哈希循环。
Ruby-on-Rails为这一目的做了很好的准备,因为它配备了一组辅助方法,使循环非常直接。这些方法将迭代的逻辑作为代码的抽象提供,因此代码保持了更高的可读性。
Ruby中最有用的循环方法
让我们来分析一下我们在Ruby中拥有的不同的循环选项的语法。目的是为了了解我们应该在什么时候使用每个方法。
for ... in
通常情况下,当我们知道循环需要执行的确切次数时,我们会使用for...in 。
比如说。
ingredients = "eggs, flour, sugar, milk"
for ingredients in 0..99 do
p "First step is mix ingredients: #{ingredients}"
end
#=> First step is mix ingredients: eggs, flour, sugar, milk
#=> First step is mix ingredients: eggs, flour, sugar, milk
#=> ...
请注意,与变量ingredients 有关的动作将被执行100次,因为这个范围(0...99)包括0和99这两个值。
次
我们在上面的文章中已经看到了这种方法。它非常直观,它可以用来执行非常简单的任务(见下文),也可以通过传递一个块来执行更复杂的任务。
# Simple syntax:
5.times p "Hello"
each和each_with_index
each方法是用来迭代元素的,当元素用完时,循环结束。因此,不需要为迭代指定一个范围或次数。
ingredients.each do |ingredient|
p "Add the #{ingredient}"
end
#=> Add the eggs
#=> Add the flour
#=> ...
记住,在这个例子中我们使用的是数组,但你也可以通过哈希或任何其他对象进行循环。
如果愿意,而且我们想跟踪元素的索引位置,我们也可以使用each_with_index 。
ingredients.each_with_index do |ingredient, index|
p "#{ingredient} is the #{index + 1} in the list."
end
#=> eggs is the 1 in the list.
#=> flour is the 2 in the list.
#=> ...
非常相似的是map 方法;而且它也允许用索引进行循环。
each_with_object
在面向对象的编程语言中,each_with_object可能非常有用。例如,如果我们想把一个数组转换为一个哈希值。
cakes = ["Brownie", "Cheesecake", "Brownie", "Brownie", "Carrotcake", "Cheesecake"]
cakes.each_with_object(Hash.new(0)) do |element, hash|
hash[element] += 1
end
#=> { "Brownie": 3, "Cheesecake": 2, "Carrotcake": 1 }
为了理解这里的逻辑,我们必须知道我们传递的对象是一个哈希,其中每个元素代表一个值为0的键。然后,每当循环找到数组上的元素时,它就把值增加1。
while 和 until
这些方法用于当我们想在一个对象中迭代若干次,但我们事先不知道它。在这种情况下,我们总是需要一个变量(在循环开始前声明)和一个条件。
i = 0
while i < 3
p i
i += 1
end
#=> 0
#=> 1
#=> 2
循环控制
循环允许在块内部进行一定程度的控制。这可以帮助我们避免某些情况下的复杂性,也可以使代码更易读。让我们看一个数字的例子,并使用next 和break 关键字的功能。
i = 0
while i < 100
i += 1
if i == 10
p "hey this is 10"
next
end
p i
if i == 20
break
end
end
这将打印从1到9的数字,然后进入if语句并打印 "嘿,这是10",并在这个特定的迭代中跳过循环的其余部分,因为next 关键字。然后,循环将以i=11恢复,并继续打印数字,直到19。当i达到20时,由于break ,if语句导致停止循环。
总结
掌握循环是非常重要的。Ruby提供了强大的方法,可以帮助你保持代码的干燥,节省空间,编写易于浏览的代码,并创建高效的Rails应用程序。