[ruby] 주입 방법에 대한 간단한 설명이 필요합니다

[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예제에서) 로 시작하는 값 과 블록 을 취하고 목록의 각 요소마다 해당 블록을 한 번 실행합니다.

  1. 첫 번째 반복에서는 시작 값으로 제공 한 값과 목록의 첫 번째 요소를 전달하고 블록이 반환 한 값을 저장합니다 (이 경우 result + element )을 저장합니다.
  2. 그런 다음 블록을 다시 실행하여 첫 번째 반복의 결과를 첫 번째 인수로, 목록의 두 번째 요소를 두 번째 인수로 전달하여 결과를 다시 저장합니다.
  3. 목록의 모든 요소를 ​​사용할 때까지이 방법을 계속합니다.

이를 설명하는 가장 쉬운 방법은 예를 들어 각 단계의 작동 방식을 보여주는 것입니다. 다음은이 결과를 평가할 수있는 가상 단계입니다.

[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”는 해당 매개 변수의 값으로 시작합니다. 효과는 요소를 더하는 것입니다.