Cú pháp cho vòng lặp for trong ruby


87

Làm cách nào để thực hiện loại vòng lặp for này trong Ruby?

for(int i=0; i<array.length; i++) {

}

@johannes Đọc một cuốn sách là một ý tưởng hay, nhưng tốt nhất là không nên đọc một cuốn về Ruby 1.6!
Andrew Grimm

Đừng quên xem qua một số phương pháp hữu ích trong ruby-doc: Mô-đun Enumerable .
Ivan Chau

Câu trả lời:


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

hoặc là

for element in array do
  element.do_stuff
end

Nếu bạn cần chỉ mục, bạn có thể sử dụng cái này:

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

15
tôi đang tìm kiếm cụ thể để lập chỉ mục trong một vòng lặp, không có giải pháp nào trong số này làm cho nó rõ ràng ngay lập tức về cách làm điều đó. op phản bội ý định của mình với array.length trong mã ...
jheriko

6
Đọc kỹ câu trả lời của tôi. Có một giải pháp lặp lại bao gồm lập chỉ mục.
Eimantas

8
Thường thì eachrất tốt. Nhưng đôi khi tôi chỉ muốn một vòng lặp for truyền thống chết tiệt. Đôi khi "Ruby way" có thể chỉ đơn giản là khó chịu.
Ruben Martinez Jr.

1
làm thế nào để tự thiết lập chỉ mục trong ruby vì vậy tôi có thể viết một loại bản thân mình
Muhammad Umer

6
điều gì sẽ xảy ra nếu tôi muốn bỏ qua hai lần lặp tiếp theo
Muhammad Umer

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

cách khác để làm điều đó là như sau

3.times do |n|
  puts n;
end

thats sẽ in 0, 1, 2, vì vậy cũng có thể được sử dụng như trình lặp mảng

Hãy nghĩ rằng biến thể đó phù hợp hơn với nhu cầu của tác giả


29

Tôi tiếp tục đánh giá đây là một liên kết hàng đầu cho google "ruby for loop", vì vậy tôi muốn thêm giải pháp cho các vòng lặp mà bước này không chỉ đơn giản là '1'. Đối với những trường hợp này, bạn có thể sử dụng phương pháp 'bước' tồn tại trên các đối tượng Số và Ngày. Tôi nghĩ rằng đây là một xấp xỉ gần đúng cho một vòng lặp '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

Sự tương đương sẽ là

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

hoặc là

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

hoặc là

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

Nó không phải là Rubyish, nhưng đó là cách tốt nhất để thực hiện vòng lặp for từ câu hỏi trong Ruby


Điều này là tuyệt vời. Đúng là câu trả lời là không eachnhưng đúng hơn each_index. +1
Dan Rosenstark

12

Để lặp lại một vòng lặp với số lần cố định, hãy thử:

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

10

Nếu bạn không cần truy cập vào mảng của mình , (chỉ một vòng lặp for đơn giản), bạn có thể sử dụng tối đa hoặc từng:

Lên đến:

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

Mỗi:

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

8

Gì? Từ năm 2010 và không ai đề cập đến Ruby có một vòng lặp for / in tốt (chỉ là không ai sử dụng nó):

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

5
Một ưu điểm của .each ... do là khối tạm thời nằm ngoài phạm vi ở cuối vòng lặp, trong khi for ... in rời khỏi phạm vi tạm thời.
Wayne Conrad

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

0

Cú pháp vòng lặp liệt kê của Ruby khác nhau:

collection.each do |item|
...
end

Điều này đọc là "một lệnh gọi đến phương thức 'each' của đối tượng mảng 'bộ sưu tập' nhận khối với 'blockargument' làm đối số". Cú pháp khối trong Ruby là 'do ... end' hoặc '{...}' đối với các câu lệnh một dòng.

Đối số khối '| item |' là tùy chọn nhưng nếu được cung cấp, đối số đầu tiên sẽ tự động đại diện cho mục được liệt kê trong vòng lặp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.