[1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10
나는이 코드를보고 있지만 뇌는 숫자 10이 어떻게 결과가 될 수 있는지 등록하지 않습니다. 여기서 무슨 일이 일어나고 있는지 설명해 주시겠습니까?
답변
첫 번째 블록 인수를 누산기로 생각할 수 있습니다. 블록의 각 실행 결과는 누산기에 저장되고 다음 블록 실행으로 전달됩니다. 위에 표시된 코드의 경우 누산기의 결과를 0으로 기본 설정합니다. 블록을 실행할 때마다 주어진 숫자가 현재 총계에 추가 된 다음 결과가 누산기에 다시 저장됩니다. 다음 블록 호출에는이 새로운 값이 있으며 추가하고 다시 저장 한 후 반복합니다.
프로세스가 끝나면 inject는 누산기를 반환합니다.이 경우 배열의 모든 값의 합 또는 10입니다.
다음은 문자열 표현으로 키가 지정된 객체 배열에서 해시를 만드는 간단한 예입니다.
[1,"a",Object.new,:hi].inject({}) do |hash, item|
hash[item.to_s] = item
hash
end
이 경우 누적기를 빈 해시로 기본 설정 한 다음 블록이 실행될 때마다 채워집니다. 블록의 결과는 누산기에 다시 저장되므로 블록의 마지막 줄로 해시를 반환해야합니다.
답변
inject
( 0
예제에서) 로 시작하는 값 과 블록 을 취하고 목록의 각 요소마다 해당 블록을 한 번 실행합니다.
- 첫 번째 반복에서는 시작 값으로 제공 한 값과 목록의 첫 번째 요소를 전달하고 블록이 반환 한 값을 저장합니다 (이 경우
result + element
)을 저장합니다. - 그런 다음 블록을 다시 실행하여 첫 번째 반복의 결과를 첫 번째 인수로, 목록의 두 번째 요소를 두 번째 인수로 전달하여 결과를 다시 저장합니다.
- 목록의 모든 요소를 사용할 때까지이 방법을 계속합니다.
이를 설명하는 가장 쉬운 방법은 예를 들어 각 단계의 작동 방식을 보여주는 것입니다. 다음은이 결과를 평가할 수있는 가상 단계입니다.
[1, 2, 3, 4].inject(0) { |result, element| result + element }
[2, 3, 4].inject(0 + 1) { |result, element| result + element }
[3, 4].inject((0 + 1) + 2) { |result, element| result + element }
[4].inject(((0 + 1) + 2) + 3) { |result, element| result + element }
[].inject((((0 + 1) + 2) + 3) + 4) { |result, element| result + element }
(((0 + 1) + 2) + 3) + 4
10
답변
inject 메소드의 구문은 다음과 같습니다.
inject (value_initial) { |result_memo, object| block }
위의 예를 해결해 봅시다.
[1, 2, 3, 4].inject(0) { |result, element| result + element }
출력으로 10 을 제공합니다 .
시작하기 전에 각 변수에 저장된 값이 무엇인지 살펴 보겠습니다.
결과 = 0 0은 inject (value) 에서 온 0입니다.
element = 1 배열의 첫 번째 요소입니다.
승인!!! 위의 예를 이해해 봅시다
1 단계 [1, 2, 3, 4].inject(0) { |0, 1| 0 + 1 }
2 단계 [1, 2, 3, 4].inject(0) { |1, 2| 1 + 2 }
단계 : 3 [1, 2, 3, 4].inject(0) { |3, 3| 3 + 3 }
단계 : 4 [1, 2, 3, 4].inject(0) { |6, 4| 6 + 4 }
단계 : 5 [1, 2, 3, 4].inject(0) { |10, Now no elements left in the array, so it'll return 10 from this step| }
여기서 굵은 기울임 꼴 값은 배열에서 가져온 요소이며 간단히 굵은 체 값이 결과 값입니다.
의 #inject
방법의 작동을 이해하기를 바랍니다 #ruby
.
답변
이 코드는 배열 내 4 개의 요소를 반복하고 이전 결과를 현재 요소에 추가합니다.
- 1 + 2 = 3
- 3 + 3 = 6
- 6 + 4 = 10
답변
그들이 말한 내용이지만 항상 “시작 값”을 제공 할 필요는 없습니다.
[1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10
와 같다
[1, 2, 3, 4].inject { |result, element| result + element } # => 10
한번 해봐, 기다릴게
주입 할 인수가 전달되지 않으면 처음 두 요소가 첫 번째 반복으로 전달됩니다. 위의 예에서 결과는 1이고 요소는 2입니다. 따라서 블록에 대한 호출이 한 번 덜 이루어집니다.
답변
주입 () 안에 넣은 숫자는 시작 위치를 나타내며 0 또는 1000 일 수 있습니다. 파이프 내부에는 2 개의 자리 표시 자 | x, y |가 있습니다. x = .inject ( ‘x’) 내부의 숫자와 secound는 객체의 각 반복을 나타냅니다.
[1, 2, 3, 4].inject(5) { |result, element| result + element } # => 15
1 + 5 = 6
2 + 6 = 8
3 + 8 = 11
11 + 4 = 15
답변
주입은 블록을 적용
result + element
배열의 각 항목에. 다음 항목 ( “element”)의 경우 블록에서 반환 된 값은 “result”입니다. 매개 변수를 사용하여 호출 한 방식으로 “result”는 해당 매개 변수의 값으로 시작합니다. 효과는 요소를 더하는 것입니다.