红宝石中for循环的语法


Answers:


118
array.each do |element|
  element.do_stuff
end

要么

for element in array do
  element.do_stuff
end

如果您需要索引,可以使用此:

array.each_with_index do |element,index|
  element.do_stuff(index)
end

15
我一直在寻找专门用于循环索引的方法,这些解决方案都无法立即使其变得显而易见。操作者在代码中使用array.length背叛了他的意图……
jheriko

6
仔细阅读我的答案。有一个包含索引的循环解决方案。
Eimantas

8
通常,each这很棒。但是有时候我只想要一个该死的传统for循环。有时,“ Ruby方式”可能只是令人讨厌。
鲁宾·马丁内斯(Ruben Martinez)

1
我该如何手动在ruby中设置索引,以便自己编写排序
Muhammad Umer

6
如果我想跳过下两个迭代,该怎么办
Muhammad Umer

77
limit = array.length;
for counter in 0..limit
 --- make some actions ---
end

另一种方法是以下

3.times do |n|
  puts n;
end

多数民众赞成在打印0、1、2,所以也可以像数组迭代器一样使用

认为该变体更适合作者的需求


29

我一直将其作为Google“ ruby​​ for loop”的顶部链接,因此我想为步骤不只是“ 1”的循环添加解决方案。对于这些情况,可以使用数字和日期对象上存在的“步骤”方法。我认为这与“ for”循环非常接近。

start = Date.new(2013,06,30)
stop = Date.new(2011,06,30)
# step back in time over two years, one week at a time
start.step(stop, -7).each do |d| 
    puts d
end

20

等价于

for i in (0...array.size)
end

要么

(0...array.size).each do |i|
end

要么

i = 0
while i < array.size do
   array[i]
   i = i + 1 # where you may freely set i to any value
end

17
array.each_index do |i|
  ...
end

它不是Rubyish,但它是在Ruby中执行for循环的最佳方法


太好了 的确答案不是each,而是each_index。+1
Dan Rosenstark 2011年

12

要循环执行固定次数,请尝试:

n.times do
  #Something to be done n times
end

10

如果您不需要访问您的array(只是一个简单的for循环),则可以使用upto或each:

取决于:

1.9.3p392 :030 > 2.upto(4) {|i| puts i}
2
3
4
 => 2 

每:

1.9.3p392 :031 > (2..4).each {|i| puts i}
2
3
4
 => 2..4 

8

什么?从2010年开始,没有人提到Ruby对于/ in循环有好处(只是没有人使用它):

ar = [1,2,3,4,5,6]
for item in ar
  puts item
end

5
.each ... does的一个优点是,块临时块在循环结束时超出范围,而for ... in将临时块保留在范围内。
韦恩·康拉德

4
['foo', 'bar', 'baz'].each_with_index {|j, i| puts "#{i} #{j}"}

0

Ruby的枚举循环语法不同:

collection.each do |item|
...
end

读为“对以'blockargument'作为参数的块的数组对象实例'collection'的'each'方法的调用”。对于单行语句,Ruby中的块语法为'do ... end'或'{...}'。

块参数'| item |' 是可选的,但如果提供的话,第一个参数自动代表循环的枚举项目。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.