여기에 한 가지 방법 많은 중입니다 :
class Array
def find_indices(val)
each_with_index.select { |e,i| e == val }.map(&:last)
end
end
[1,3,5,2,6,3,5,7,8,3,2,4].find_indices(3)
#=> [1, 5, 9]
여기에서 일어나고있는 일입니다. 먼저 val
은 3
과 동일하게 설정됩니다. 다음으로 명시적인 수신자가 제공되지 않으므로 Enumerable#each_with_index 메서드는 self
으로 전송됩니다.
puts "self = #{self}"
을하는 방법 find_indices
의 시작 : self
은 쉽게 줄을 추가하여 확인할 수 있습니다 배열을, 같습니다. 이제 당신이 얻을 것이다 :
[1,3,5,2,6,3,5,7,8,3,2,4].find_indices(3)
# self = [1, 3, 5, 2, 6, 3, 5, 7, 8, 3, 2, 4]
#=> [1, 5, 9]
당신이 문서에서 볼 때, each_with_index
이 블록을 제공하지 않기 때문에, 열거가 반환됩니다
enum = [1,3,5,2,6,3,5,7,8,3,2,4].each_with_index
#=> #<Enumerator: [1, 3, 5, 2, 6, 3, 5, 7, 8, 3, 2, 4]:each_with_index>
이 enum
의 요소를 검사 수로 변환하기 어레이 :
enum.to_a
#=> [[1, 0], [3, 1], [5, 2], [2, 3], [6, 4], [3, 5],
# [5, 6], [7, 7], [8, 8], [3, 9], [2, 10], [4, 11]]
다음으로 상기 방법을 Enumerable#selectenum
에 보내기
01,
new_enum = enum.select
#=> #<Enumerator: #<Enumerator: [1, 3, 5, 2, 6, 3, 5, 7,
# 8, 3, 2, 4]:each_with_index>:select>
new_enum.to_a
#=> [[1, 0], [3, 1], [5, 2], [2, 3], [6, 4], [3, 5],
# [5, 6], [7, 7], [8, 8], [3, 9], [2, 10], [4, 11]]
new_enum
의 설명을주의 깊게 살펴보십시오. "복합 열거 자"라고 생각하는 것이 도움이되지만 열거 자라는 점을 알 수 있습니다.
이제 우리는 select
블록을 제공하므로 new_enum
의 각 요소가 블록으로 전달됩니다. 전달 된 첫 번째 요소는 [1, 0]
이며, 블록 변수의 할당한다 : 우리는 (e == val) #=> (1 == 3) #=> false
는, 요소가 선택되지 않도록 찾을
e, i = [1, 0]
e #=> 1
i #=> 0
. 블록에 전달 된 다음 요소 인 [3, 1]
은 (3 == 3) #=> true
이되므로 [3, 1]
이 선택됩니다.
우리는 얻을 :
a = new_enum.each { |e,i| e == val }
#=> [[3, 1], [3, 5], [3, 9]]
우리가 원하는 이러한 값의 인덱스를이다, 우리는 매핑하여 그들을 추출하는 :
a.map { |e| e.last }
:
a.map(&:last)
#=> [1, 5, 9]
에 해당되는
이렇게 마지막 작업을 수행 할 수도 있습니다.
a.transpose.last
이렇게하는 또 다른 간단한 방법은 다음과 같습니다.
class Array
def find_indices(val)
index = 0
each_with_object([]) do |e,a|
(a << index) if e == val
index += 1
end
end
end
[1,3,5,2,6,3,5,7,8,3,2,4].find_indices(3)
#=> [1, 5, 9]
시도한 것을 보여주는 코드를 게시해야합니다. –
이것을 돕는 대부분의 메소드는 Enumerable 모듈에 있습니다 (그리고 배열은 열거 가능합니다). –
이 질문은 매우 잘 닫힙니다. 내가하지 희망. [묻는 방법] (http://stackoverflow.com/help/how-to-ask)의 지침을 검토하고 '이 문제를 해결하기 위해 노력한'곳에서 참조 할 수있는 코드를 제공하여 귀하의 질문과 관련된 피드백을 얻고 귀하의 상황에있는 다른 사람들에게 도움이됩니다. – vgoff