programing

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

starjava 2023. 6. 1. 21:38
반응형

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

[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. 반복 시의 첫 이에는 첫번반이서시값제값요전첫번를소달하다고블니값저록반합경이장우을한환째목록의과한공째로으복에작이▁of▁on▁returned▁thein▁that,경(,다▁list우▁it▁passes▁value니,▁this).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 (value_initial) { |result_memo, object| block }

위의 예를 들어 보겠습니다.

[1, 2, 3, 4].inject(0) { |result, element| result + element }

10을 출력으로 제공합니다.

시작하기 전에 각 변수에 저장된 값을 살펴보겠습니다.

결과 = 0 0은 0인 주입(값)에서 왔습니다.

요소 = 1 배열의 첫 번째 요소입니다.

좋아요!!! 이제 위의 예를 이해하기 시작하겠습니다.

계단:1[1, 2, 3, 4].inject(0) { |0, 1| 0 + 1 }

[1, 2, 3, 4].inject(0) { |1, 2| 1 + 2 }

~ 단계:3[1, 2, 3, 4].inject(0) { |3, 3| 3 + 3 }

~:4계:4[1, 2, 3, 4].inject(0) { |6, 4| 6 + 4 }

계단[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일 수 있습니다.파이프 안에는 두 개의 자리 표시자 |x, y|가 있습니다.x = .('x' 안에 있는 임의의 숫자)이고, 두 번째 소리는 개체의 각 반복을 나타냅니다.

[1, 2, 3, 4].inject(5) { |result, element| result + element } # => 15

1 + 5 = 6 2 + 6 = 8 3 + 8 = 11 11 + 4 = 15

Inject는 블록을 적용합니다.

result + element

배열의 각 항목으로 이동합니다.다음 항목("요소")의 경우 블록에서 반환되는 값은 "결과"입니다.매개 변수를 사용하여 "결과"라고 부르는 방법은 해당 매개 변수의 값으로 시작합니다.그래서 그 효과는 요소들을 더하는 것입니다.

tldr; inject와 .map 한가지중방법로으한요:로:inject블록의 마지막 실행 값을 반환하는 반면map반복된 배열을 반환합니다.

블록 실행의 값 이상은 첫 번째 매개 변수를 통해 다음 실행으로 전달됩니다(result할 수 . 이 "" " " " " " " 입니다." 입니다.(0)

위의 예는 다음을 사용하여 작성할 수 있습니다.map다음과 같이:

result = 0 # initialize result
[1, 2, 3, 4].map { |element| result += element }
# result => 10

같은효지만과▁same만지▁but.inject여기서는 더 간결합니다.

당은종과발것을발것다입니에서 것을 할 수 map는 록블, 평에다발서생다에서 진행됩니다.inject블록으로 막다

하느냐는 당신이 .result사용하지 않을 때는 다음과 같습니다.

result = [1, 2, 3, 4].inject(0) { |x, element| x + element }

한 ."라고도 있지만, 으로 "보분은요세, 저그을모한줄결두니다습합했로들여것러는▁for."보▁you다니습,"결,합▁memory했▁tempor줄arily▁also▁allocated▁"한로▁but"에 메모리를 할당했습니다.라고 말할 수 있지만, 여러분은 또한 일시적으로 메모리를 할당했습니다.x당신이 이미 가지고 있었기 때문에 필요하지 않았던 스크래치 변수로서.result함께 일할 수 있는

[1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10

는 다음과 같습니다.

def my_function(r, e)
  r+e
end

a = [1, 2, 3, 4]
result = 0

a.each do |value|
  result = my_function(result, value)
end

이것은 간단하고 상당히 이해하기 쉬운 설명입니다.

"초기값"은 처음에는 다소 혼란스러우므로 잊어버리십시오.

> [1,2,3,4].inject{|a,b| a+b}
=> 10

위의 내용은 다음과 같이 이해할 수 있습니다: 1,2,3,4 사이에 "가산기"를 주입하고 있습니다. 즉, 1♫ 2♫ 3♫ 4이고, ♫은 가산기이므로 1+2+3+4와 같고, 10입니다.

당신은 실제로 주사를 놓을 수 있습니다.+그들 사이에:

> [1,2,3,4].inject(:+)
=> 10

그리고 그것은 마치, 주사를 놓는 것과 같습니다.+1, 2, 3, 4 사이에서 1 + 2 + 3 + 4가 되고 10이 됩니다.:+Ruby의 방법은 다음과 같습니다.+기호의 형태로

이것은 이해하기 쉽고 직관적입니다.어떻게 작동하는지 단계별로 분석하려면 1과 2를 선택하고, 이제 추가하고, 결과가 나오면 먼저 저장하고(3), 그 다음에 저장된 값 3과 배열 요소 3이 a + b 프로세스를 거칩니다(6), 이제 이 값을 저장하고, 6과 4는 a + b 프로세스를 거칩니다(10).당신은 본질적으로 하고 있습니다.

((1 + 2) + 3) + 4

그리고 10살입니다."초기값"0처음부터 "기지"일 뿐입니다.많은 경우에, 당신은 그것이 필요하지 않습니다.당신이 1 * 2 * 3 * 4가 필요하다고 상상해 보세요.

[1,2,3,4].inject(:*)
=> 24

그리고 그것은 끝났습니다.의 "초기값"이 필요하지 않습니다.1전체를 곱하여1이번에는, 그것은 하고 있습니다.

(((1 * 2) * 3) * 4)

그리고 당신은 같은 결과를 얻습니다.

1 * 2 * 3 * 4

[1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10

간단한 영어로, 당신은 이 배열을 통해 (반복)하고 있습니다.[1,2,3,4]) 4개의 요소(1, 2, 3, 4)가 있기 때문에 이 배열을 4번 반복합니다.주입 방법에는 1개의 인수(숫자 0)가 있으며, 이 인수를 첫 번째 요소(0 + 1)에 추가합니다.이 값은 1)과 같습니다. 1은 "결과"에 저장됩니다.그런 다음 결과(1)를 다음 요소(1 + 2)에 추가합니다.이것은 3)입니다.이제 결과로 저장됩니다.계속하세요: 3 + 3은 6입니다.마지막으로 6 + 4는 10입니다.

이 코드는 시작 값을 전달하지 못할 가능성을 허용하지 않지만 진행 상황을 설명하는 데 도움이 될 수 있습니다.

def incomplete_inject(enumerable, result)
  enumerable.each do |item|
    result = yield(result, item)
  end
  result
end

incomplete_inject([1,2,3,4], 0) {|result, item| result + item} # => 10

어느 날, 저는 또한 Ruby inject/reduce 메서드의 기본값에 대해 머리를 부딪치고 있었기 때문에 제 문제를 시각화하려고 했습니다.

기본값:가상화

여기서 시작한 다음 블록을 사용하는 모든 방법을 검토합니다.http://ruby-doc.org/core-2.3.3/Enumerable.html#method-i-inject

당신을 혼란스럽게 하는 것은 블록입니까, 아니면 당신이 방법에 가치가 있는 이유입니까?좋은 질문입니다.그곳의 운영자 방법은 무엇입니까?

result.+

무엇으로 시작합니까?

#inject(0)

할 수 있을까요?

[1, 2, 3, 4].inject(0) { |result, element| result.+ element }

이것이 효과가 있습니까?

[1, 2, 3, 4].inject() { |result = 0, element| result.+ element }

보시다시피, 저는 배열의 모든 요소들을 요약하고 문서에서 보이는 메모에 숫자를 산출한다는 생각을 바탕으로 하고 있습니다.

언제든지 할 수 있습니다.

 [1, 2, 3, 4].each { |element| p element }

배열의 열거형이 반복되는지 확인합니다.그것이 기본적인 생각입니다.

단지 주입기나 축소기가 당신에게 보내는 메모나 축적기를 줄 뿐입니다.

우리는 결과를 얻기 위해 노력할 수 있습니다.

[1, 2, 3, 4].each { |result = 0, element| result + element }

하지만 아무것도 돌아오지 않기 때문에 이것은 이전과 똑같이 행동합니다.

[1, 2, 3, 4].each { |result = 0, element| p result + element }

요소 검사기 블록에 있습니다.

다른 형태의 .inject() 메서드가 있습니다. 이 메서드는 매우 유용합니다 [4,5].주입(&:+) 그러면 해당 영역의 모든 요소가 합산됩니다.

모든 종류의 컬렉션을 사용할 때 발생하는 일반적인 시나리오는 모든 요소에 대해 단일 유형의 작업을 수행하고 결과를 수집하는 것입니다.

예를 들어, sum(array) 함수는 배열로 전달된 모든 요소를 추가하고 결과를 반환하려고 할 수 있습니다.

동일한 기능에 대한 일반화된 추상화는 축소(inject는 별칭)라는 이름으로 Ruby에 제공됩니다.즉, 이러한 메소드는 컬렉션 위에서 반복되며 연산자를 사용하여 요소에 대한 작업 값을 기본값으로 누적하고 결국 해당 기본값을 반환합니다.

더 잘 이해하기 위해 예를 들어 보겠습니다.

>>> (5..10).inject(1) {|product, n| product * n }
=> 151200

위의 예에서는 기본값 1, 열거형(5..10) 및 계산된 값을 기본값에 추가하는 방법(즉, 제품이 기본값으로 초기화되는 제품에 어레이 요소를 곱하는 식)을 설명하는 블록

따라서 실행은 다음과 같습니다.

# loop 1
n = 1
product = 1
return value = 1*1

# loop 2
n = 2
product = 1
return value = 1*2

n = 3
product = 2
return value = 2*3

기본값은 식이 컨테이너 요소를 통과함에 따라 지속적으로 업데이트되므로 결과적으로 기본값의 최종 값이 반환됩니다.

다음과 같습니까?

[1,2,3,4].inject(:+)
=> 10

언급URL : https://stackoverflow.com/questions/710501/need-a-simple-explanation-of-the-inject-method

반응형