2010-03-04 26 views
97

Tôi có thiếu thứ gì đó trong tài liệu Array không? Tôi có một mảng chứa tối đa một đối tượng thỏa mãn một tiêu chí nhất định. Tôi muốn tìm ra đối tượng đó một cách hiệu quả. Ý tưởng tốt nhất mà tôi có được từ các tài liệu là:Đối tượng find_first của Ruby Array?

candidates = my_array.select { |e| e.satisfies_condition? } 
found_it = candidates.first if !candidates.empty? 

Nhưng tôi không hài lòng vì hai lý do: (1) mà chọn khiến tôi đi qua toàn bộ mảng, mặc dù chúng ta có thể giải cứu sau khi hit đầu tiên, và (2) Tôi cần một dòng mã (có điều kiện) để làm phẳng các ứng cử viên. Cả hai hoạt động là lãng phí với sự hiểu biết rằng có 0 hoặc 1 đối tượng thỏa mãn.

Những gì tôi muốn là một cái gì đó như:

array.find_first(block) -> câu trả lời bằng không hoặc đối tượng đầu tiên mà các khối để đánh giá đúng, chấm dứt traversal ở đối tượng đó.

Tôi có phải tự viết bài này không? Tất cả những phương pháp tuyệt vời khác trong Array khiến tôi nghĩ rằng nó ở đó và tôi không thấy nó.

Cảm ơn trước, Dan

Trả lời

143

Hoặc là tôi không hiểu câu hỏi của bạn, hoặc Enumerable#find là điều bạn đang tìm kiếm.

+1

Nope. Tôi nghĩ bạn hiểu nó. Cảm ơn (và cho những người khác). Tôi không thấy bất kỳ phương pháp nào có thể đếm được. Đó chỉ là những gì tôi cần. Xin lỗi đã làm phiền. –

+25

Không có vấn đề gì, tôi cũng thường thấy khó chịu khi tài liệu ruby ​​không liệt kê các phương thức của tất cả các lớp và mô-đun được thừa kế hoặc bao gồm. –

+1

thông tin thêm: '[1,2,3,5,2] .find {| n | đặt n; n == 2} 'lặp lại dừng khi nó tìm thấy phần tử đầu tiên khớp với nó. – rajuGT

11

Đoán bạn chỉ cần bỏ qua phương pháp tìm trong các tài liệu:

my_array.find {|e| e.satisfies_condition? } 
+4

Hoặc nếu bạn thích chơi gôn mã, 'my_array.find (&: satisfies_condition?)' –

8

Bạn có cần các đối tượng bản thân hay bạn chỉ cần biết nếu có một đối tượng mà thỏa mãn. Nếu trước đây thì có: sử dụng find:

found_object = my_array.find { |e| e.satisfies_condition? } 

nếu không bạn có thể sử dụng any?

found_it = my_array.any? { |e| e.satisfies_condition? } 

Sau đó sẽ cứu với "true" khi nó tìm thấy một thỏa mãn điều kiện. Trước đây sẽ làm như vậy, nhưng trả lại đối tượng.

65

sử dụng mảng detect phương pháp nếu bạn muốn quay trở lại giá trị đầu tiên mà khối trả về true

[1,2,3,11,34].detect(&:even?) #=> 2 

OR 

[1,2,3,11,34].detect{|i| i.even?} #=> 2 

Nếu bạn muốn trả lại toàn bộ giá trị mà khối trả về true sau đó sử dụng select

[1,2,3,11,34].select(&:even?) #=> [2, 34] 
+4

'.detect' là chính xác những gì tôi cần. Nhưng sự khác biệt với '.find' là gì? –

+10

@AugustinRiedinger không có sự khác biệt, cả hai đều giống nhau.'detect' chỉ là một bí danh để 'tìm' http://ruby-doc.org/core-2.1.2/Enumerable.html#method-i-find –

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