2009-07-24 5 views
1

| m, k | 나를 사로 잡는 것. 이것은 우선 순위와 관련이 있습니까? m은 0 (또는 일부 언어는 1)이고 Array/Hash의 마지막은 k입니다.어쩌면 나는 Ruby에서 아이디어를 얻지 못했지만 Enumerables에 대한 질문이 있습니다.

사람들이 .inject()에 숫자를 넣는 이유는 무엇입니까?

또는 사용법을 배우는 쉬운 방법이 있으며 그 가치는 무엇입니까? 이 질문에 비추어 볼 때, 저는 여러분 모두가 모든 프로그래밍 언어에 대해 거의 noobish라는 것을 알기를 바랍니다. Ruby가 제 첫 선택이었습니다.

+1

가 특정 예를 들어 당신이 있습니까 ' 설명하는 걸 좋아하니? kjfletch의 답변은 좋은 bt입니다. 질문을 펼치면 사람들이 좀 더 자세한 정보를 제공 할 수 있습니다. – mikej

답변

5

메소드 인수와 혼동하는 블록 인수가있는 것처럼 보입니다.

사람들이 inject() 메소드에 전달하는 숫자는 | m, k |를 사용할 때 "m"의 초기 값을 결정하는 메소드 인수입니다. 블록. 나는 그들이 m과 k라는 이름의 곳을 보았는지, 왜 이름이 지어 졌는지를 알지 못한다.

kjfletch의 링크 breakdown of an inject()에 설명 된 방식으로 보면 "result"와 "element"라는 이름을 사용하는 것이 더 간단합니다.

inject()를 사용할 때의 값은 간결하게 나타낼 수있는 기능입니다. inject()로하고 싶은 것은 each() 메소드를 호출하고 훨씬 더 긴 블록과 추가 변수 선언을 사용하여 수행 할 수 있습니다. 감정을 얻으려면 this question and the answer을 참조하십시오.

6

예를 들어 보겠습니다.

numbers = [ 3, 1, 4, 1, 5, 9 ] 
sum = numbers.inject(0) do |prefix_sum, number| 
    prefix_sum + number 
end 

#inject은 하나의 인수와 블록을 취합니다. 블록은 두 개의 값을 가져와 새로운 값을 반환해야합니다.

위의 예에서 #inject의 인수는 0이고 블록은 do |prefix_sum, number| prefix_sum + number end입니다. 블록에 전달되는 값은 두 | 마커 (prefix_sumnumber) 사이에 이름이 지정됩니다.

열거 형 #inject의 각 값은 두 번째 값으로 차례대로 블록에 전달됩니다. 이 예에서 number3이고, 그 다음에 1이고, 그 다음에 4이고, 그 다음에 1이고, 그 다음에 5이고, 마지막으로 9이 될 것입니다. 따라서이 예에서 블록은 6 번 호출됩니다. numbers의 각 직위에 한 번

블록 (여기서는 prefix_sum)에 전달 된 첫 번째 값은 보통 누적 기이라고합니다. 블록이 처음으로 호출 될 때 사용한 값인 #inject#inject에 전달 된 인수 (이 예제에서는 0)에 의해 설정됩니다. 블록의 리턴 값은 블록의 다음 호출을위한 누적 기 (prefix_sum)의 값을 결정합니다.

처리 할 요소가 더 이상없는 경우 누적 기 값이 반환됩니다 (여기서는 sum에 저장 됨).

그래서 그것을 통해 산책을 할 수 있습니다 :

  • #inject0 우리의 블록을받습니다.
  • #inject3-0prefix_sum (초기 누산기 값)과 number (제 배열 값) 결합 당사 블록을 호출한다.
  • 저희 블록은 0+33으로 계산하여 돌려드립니다.
  • #inject3-prefix_sum (반환 값)과 number1 행 (두 번째 배열 값)
  • 우리 블록 43+1 같이 계산 돌려 결합 당사 블록을 호출한다.
  • #inject4-prefix_sum (반환 값)과 number4 행 (세 번째 배열 값)
  • 우리 블록 84+4 계산 돌려 결합 당사 블록을 호출한다.
  • #inject8-prefix_sum (반환 값)과 number1 행 (네 번째 배열 값)
  • 우리 블록으로 98+1 계산 돌려 결합 당사 블록을 호출한다.
  • #inject9-prefix_sum (반환 값)과 number5 행 (다섯 번째 배열 값)
  • 우리 블록으로 149+5 계산 돌려 결합 당사 블록을 호출한다.
  • #inject14-prefix_sum (반환 값)과 number9 행 (여섯 번째 배열 값)
  • 우리 블록 23 같은 14+9 계산 돌려 결합 당사 블록을 호출한다.
  • 더 이상 배열 요소가 없기 때문에 #inject23을 반환하고 sum을 해당 값으로 바인딩합니다.

당신은 caluculating,이 예에서, 항목의 목록에서 작업을 parenthesizing로에서 분사 볼 수 있습니다 :

이것은 당신이 일반적으로 인수 만 한 쌍의에서 작동 모든 작업을 할 수 있습니다
((((((0 + 3) + 1) + 4) + 1) + 5) + 9) 

, 그것을 목록에 적용하십시오.

+0

+1 좋은 설명 –

2

Ruby에서 어떤 작업을 수행하고 있는지 알아 보려면 번들로 제공된 ri 도구를 사용하십시오 (따라서 "Enumerable.inject"를 입력하여 문서를 검색 할 수 있음) 또는 Ruby-Doc을 검색 할 수 있습니다.이 경우 see :

누적 기 값 (메모)과 각 요소를 순서대로 적용하여 열거 형 요소를 결합합니다. 각 단계에서 메모는 블록이 반환 한 값으로 설정됩니다. 첫 번째 양식을 사용하면 메모에 초기 값을 제공 할 수 있습니다. 두 번째 형식은 컬렉션의 첫 번째 요소를 초기 값으로 사용합니다 (반복하는 동안 해당 요소를 건너 뜁니다).

완전성
# Sum some numbers 
(5..10).inject {|sum, n| sum + n }    #=> 45 
# Multiply some numbers 
(5..10).inject(1) {|product, n| product * n } #=> 151200 

# find the longest word 
longest = %w{ cat sheep bear }.inject do |memo,word| 
    memo.length > word.length ? memo : word 
end 
longest           #=> "sheep" 

# find the length of the longest word 
longest = %w{ cat sheep bear }.inject(0) do |memo,word| 
    memo >= word.length ? memo : word.length 
end 
longest           #=> 5 
0

: 보통 메모 수단 m; k을 의미 할 수 있습니다. v과 조합하여 사용하는 경우가 많으므로 값이입니다. 따라서, 예를 들어 :

stuff.inject({}) { |m,(k,v)| m.merge(k.to_sym => v) } 

을 나는 또한 본 적이 사람들은 다음과 같이 누적 및 요소에 대한 전자에 대한 를 사용

numbers.inject { |a,e| a+e }