어레이 설명서에서 누락 된 것이 있습니까? 특정 기준을 만족시키는 최대 하나의 객체를 포함하는 배열이 있습니다. 해당 객체를 효율적으로 찾고 싶습니다. 내가 문서에서 얻은 가장 좋은 아이디어는 다음과 같습니다.
candidates = my_array.select { |e| e.satisfies_condition? }
found_it = candidates.first if !candidates.empty?
그러나 나는 두 가지 이유로 불만족 스럽다.
- 그
select
날 우리가 첫 번째 히트 후 구제 한 수에도 불구하고, 전체 배열을 통과했다. - 후보자를 평평하게하기 위해 조건이있는 코드 줄이 필요했습니다.
두 작업 모두 만족스러운 객체가 0 또는 1 개라는 것을 알고 낭비됩니다.
내가 원하는 것은 다음과 같습니다.
array.find_first(block)
nil 또는 블록이 참으로 평가되는 첫 번째 객체를 반환하고 해당 객체의 순회를 종료합니다.
직접 써야합니까? Array의 다른 모든 위대한 방법은 그것이 있다고 생각하게하고 그것을 보지 못합니다.
답변
귀하의 질문을 이해하지 못하거나 Enumerable # find 가 귀하가 찾고있는 것입니다.
답변
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]
답변
문서에서 find 메소드를 놓친 것 같습니다.
my_array.find {|e| e.satisfies_condition? }
답변
물체 자체가 필요합니까, 아니면 만족스러운 물체 가 있는지 알아야합니다 . 전자의 경우 예 : find를 사용하십시오.
found_object = my_array.find { |e| e.satisfies_condition? }
그렇지 않으면 당신은 사용할 수 있습니다 any?
found_it = my_array.any? { |e| e.satisfies_condition? }
후자는 조건을 만족하는 것을 찾으면 “참”으로 보석이됩니다. 전자는 동일한 작업을 수행하지만 객체를 반환합니다.