Câu trả lời:
Các with_index
phương pháp lấy một tham số tùy chọn để bù đắp các chỉ số bắt đầu. each_with_index
làm điều tương tự, nhưng không có chỉ mục bắt đầu tùy chọn.
Ví dụ:
[:foo, :bar, :baz].each.with_index(2) do |value, index|
puts "#{index}: #{value}"
end
[:foo, :bar, :baz].each_with_index do |value, index|
puts "#{index}: #{value}"
end
Kết quả đầu ra:
2: foo
3: bar
4: baz
0: foo
1: bar
2: baz
each_with_index
đã được đưa vào Ruby trước đó. with_index
đã được giới thiệu sau:
0
.Ngày nay, việc sử dụng with_index
sẽ tốt hơn từ quan điểm tổng quát và dễ đọc, nhưng từ quan điểm tăng tốc mã, each_with_index
chạy nhanh hơn một chút each.with_index
.
Khi bạn cảm thấy rằng một phương pháp duy nhất có thể dễ dàng được thể hiện bằng cách xâu chuỗi đơn giản một vài phương thức, thì thường là phương pháp đơn nhanh hơn chuỗi. Đối với một ví dụ khác về điều này, reverse_each
chạy nhanh hơn reverse.each
. Những phương pháp này có lý do để tồn tại.
reverse
ví dụ, hàm reverse
trả về một mảng khác, không phải là một liệt kê. Nếu nó trả về một điều tra viên, thì nó không nên chậm hơn với việc triển khai tốt.
with_index
cho phép một chỉ số bắt đầu bù đắp,with_index
thường được ưa thích khi sử dụng kết hợp vớimap
,reduce
,collect
vv Nói tóm lại,map.with_index
đọc tốt hơn so vớieach_with_index.map
. Theo một nghĩa nào đó, khi được sử dụng vớimap
, nó là một giá trị thay thế chomap_with_index
phương thức không tồn tại .