루비 배열 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.