2012-05-01 39 views
16

Làm cách nào để đặt độ lệch bắt đầu cho vòng lặp each trong ruby? Tôi muốn vòng lặp bắt đầu từ a[3] thay vì a[0]. Làm thế nào để tôi thiết lập điều đó?Ruby - mỗi bù đắp bắt đầu

a = [ab, cd, ef, gh, hi, jk] 

a.each do |i| 
#some stuff 
end 

Trả lời

34

khác, khả năng trực tiếp và dễ đọc hơn là sử dụng Array#drop:

a.drop(3).each do |i| 
    # do something with item i 
end 

Bây giờ điều này thực sự tỏa sáng nếu kết hợp với các phương pháp khác được kế thừa từ Enumerable, vì vậy rất có thể là có một lựa chọn tốt hơn cho vòng lặp bắt buộc each bắt buộc của bạn. Giả sử bạn muốn lọc slice trích xuất và chuyển đổi nó sau đó:

a = [0,1,2,3,4,5,6,7] 
a.drop(3).select(&:even?).map { |x| x * 2 } 
# => [8, 12] 

Hoặc nói rằng bạn muốn in một danh sách tất cả các giá trị:

a = ["1", "2", "3", "4", "5"] 
puts a.drop(3).join("\n") 

Output:

4 
5 

Những các tính năng được kế thừa từ lập trình chức năng là điều khiến Ruby trở nên mạnh mẽ :)

+0

Ngôn ngữ lập trình chức năng nào ảnh hưởng đến kiểu lập trình này? – Vass

+1

@Vass Trong LISP và sau đó Haskell dựa nhiều vào danh sách liên kết đơn lẻ liên tục, kiểu này khá phổ biến (ví dụ bạn sẽ tìm thấy các hàm cổ điển 'map',' filter', 'take',' drop', 'zip' vv mà bạn cũng tìm thấy trong module 'Enumerable' Ruby) –

+0

Nó sẽ được tốt đẹp để xem một loạt các phương pháp như thả, trong khi thực hiện tìm kiếm nhị phân hoặc một số thuật toán sắp xếp khác – Donato

19

Sử dụng each trên subpart của mảng. Trong ví dụ dưới đây, từ các yếu tố thứ tư đến cùng:

a[3..-1].each do |i| 
    #some stuff 
end 
+0

a [a.size - 1] .each do | i | – JohnMerlino

4

này sẽ giúp bạn

a[3..-1].each do |i| 
    #your logic 
end 
3

Hầu hết Rubyist của quên đi cái cũ tốt cho vòng lặp:

n = 3 
for i in n...a.size 
    puts a[i] 
end 
+4

Bởi vì nó hút, vì nó không giới thiệu một phạm vi mới, đó là phản trực giác vì nó sử dụng 'do/end'. Ngoài ra, OP muốn liệt kê các mục mảng, không phải các chỉ mục. –

+0

Huh? Mỗi cũng sử dụng do/end? Nếu bạn muốn một phạm vi mới, không sử dụng proc đóng cửa, sử dụng một cuộc gọi phương thức bên trong vòng lặp. Nếu có sự khác biệt chủ yếu giữa cho và mỗi khối mã của họ, tôi muốn biết điều đó (tôi cũng sử dụng cho các vòng lặp): –

+1

Dù sao, tôi đã thêm [i] thay vì i vào mã, cám ơn. –

Các vấn đề liên quan