루비 배열 find_first 객체?


135

어레이 설명서에서 누락 된 것이 있습니까? 특정 기준을 만족시키는 최대 하나의 객체를 포함하는 배열이 있습니다. 해당 객체를 효율적으로 찾고 싶습니다. 내가 문서에서 얻은 가장 좋은 아이디어는 다음과 같습니다.

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

그러나 나는 두 가지 이유로 불만족 스럽다.

  1. select날 우리가 첫 번째 히트 후 구제 한 수에도 불구하고, 전체 배열을 통과했다.
  2. 후보자를 평평하게하기 위해 조건이있는 코드 줄이 필요했습니다.

두 작업 모두 만족스러운 객체가 0 또는 1 개라는 것을 알고 낭비됩니다.

내가 원하는 것은 다음과 같습니다.

array.find_first(block)

nil 또는 블록이 참으로 평가되는 첫 번째 객체를 반환하고 해당 객체의 순회를 종료합니다.

직접 써야합니까? Array의 다른 모든 위대한 방법은 그것이 있다고 생각하게하고 그것을 보지 못합니다.

답변:


201

귀하의 질문을 이해하지 못하거나 Enumerable # find 가 귀하가 찾고있는 것입니다.


32
문제 없습니다. 루비 문서에 상속되거나 포함 된 모든 클래스와 모듈의 메소드가 나열되어 있지 않은 경우가 종종 있습니다.
Mladen Jablanović

4
추가 정보 : [1,2,3,5,2].find { |n| puts n; n == 2 } 반복은 일치하는 첫 번째 요소를 찾으면 중지됩니다.
rajuGT

97

detect블록이 true를 반환하는 첫 번째 값을 반환 하려면 배열 방법을 사용하십시오.

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

OR

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

block이 true를 반환하는 모든 값을 반환하려면 다음을 사용하십시오. select

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

5
.detect정확히 내가 필요한 것입니다. 그러나 .find그때 의 차이점은 무엇 입니까?
Augustin Riedinger

13
@AugustinRiedinger 차이점은 없습니다. 둘 다 동일합니다. ruby-doc.org/core-2.1.2/Enumerable.html#method-i-finddetect 의 별칭 find 일뿐입니다.
Sandip Ransing

어떤 일관성을 위해 내가 따라 좋아하는 루비 스타일 가이드 호의가 발견
폴 밴 Leeuwen

20

문서에서 find 메소드를 놓친 것 같습니다.

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

8
또는 당신은 코드 골프, 좋아하는 경우my_array.find(&:satisfies_condition?)
앤드류 그림 형제

14

물체 자체가 필요합니까, 아니면 만족스러운 물체 있는지 알아야합니다 . 전자의 경우 예 : find를 사용하십시오.

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

그렇지 않으면 당신은 사용할 수 있습니다 any?

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

후자는 조건을 만족하는 것을 찾으면 "참"으로 보석이됩니다. 전자는 동일한 작업을 수행하지만 객체를 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.