2012-06-11 14 views
5

Giả sử tôi có đối tượng được liệt kê enum và bây giờ tôi muốn lấy mục thứ ba.tham chiếu giá trị điều tra với chỉ mục được chỉ định

Tôi biết một trong những cách tiếp cận chung được chuyển đổi thành một mảng và sau đó truy cập với chỉ số như:

enum.to_a[2] 

Nhưng cách này sẽ tạo ra một mảng tạm thời và nó có thể là không hiệu quả.

Bây giờ tôi sử dụng:

enum.each_with_index {|v, i| break v if i == 2} 

Nhưng điều này là khá xấu xí và không cần thiết.

Cách hiệu quả nhất để thực hiện việc này là gì?

Trả lời

5

Bạn có thể sử dụng take để bóc ba yếu tố đầu tiên và sau đó last để lấy các yếu tố thứ ba từ mảng đó take mang đến cho bạn:

third = enum.take(3).last 

Nếu bạn không muốn tạo ra bất kỳ mảng nào cả sau đó có thể:

# If enum isn't an Enumerator then 'enum = enum.to_enum' or 'enum = enum.each' 
# to make it one. 
(3 - 1).times { enum.next } 
third = enum.next 
+0

Điều này có vẻ tốt hơn nhưng nếu tôi muốn có số lượng rất lớn làm chỉ mục, nó vẫn sẽ tạo ra một mảng tạm thời rất lớn. –

+0

@ShouYa: Tôi đã thêm tùy chọn ít mảng khác trong khi bạn đang nhận xét. Bạn vẫn phải đánh dấu vào 'enum' từng người một nhưng không có gì bạn có thể làm về điều đó (nói chung). –

+0

Sử dụng tiếp theo là một gợi ý thông minh. Tôi sẽ tò mò muốn biết ý nghĩa của buổi biểu diễn được so sánh với việc chuyển đổi một bộ sưu tập thành một mảng. –

1

Thật không may, để truy cập thành viên theo chỉ mục, nó phải được chuyển đổi thành mảng (nếu không bạn sẽ không có chỉ mục), vì vậy mã của bạn trông hoàn toàn ổn với tôi.

+0

Um, không. Nếu 'e' là một' Enumerator' thì '2.times {e.next}' sẽ đánh dấu và bỏ đi hai giá trị đầu tiên và 'e.next' thứ ba sẽ cho bạn cái thứ ba mà không tạo ra bất kỳ mảng nào. –

+0

@muistooshort yep, tôi đã trả lời chủ đề của bạn. Và bạn đúng trong sự tôn trọng đó. –

5

Thay thế câu trả lời của mu bằng cách sử dụng enumerable-lazy hoặc Ruby 2.1. Như lười biếng khi sử dụng next nhưng nhiều khai báo hơn:

enum.lazy.drop(2).first