2013-04-09 3 views
1

을 설명해주십시오 :나는이 방법의 별에 관한 질문이이 방법

def multiplies_array(*numbers) 
    numbers.inject(1, :*) 
end 

인수 목록 (*numbers)에서 별의 의미는 무엇입니까? 콜론 다음에 별의 의미는 무엇입니까 (1, :*)?

+1

첫 번째 것은 "splat operator", google입니다. 두 번째 것은 일반적인 기호입니다 ('Enumerable # inject'에 대한 문서를 참조하십시오.) –

답변

2

첫 번째 별은 표시 연산자입니다. 이 경우 multiplies_array에 주어진 모든 매개 변수를 단일 배열로 "수집"합니다. 네 개의 매개 변수를 이런 식으로 호출

...

multiplies_array 1, 2, 3, 4 

은 ... 당신에게 방법에 네 개의 요소를 하나의 배열을 제공합니다.

def multiplies_array(numbers) # Without splat operator 
end 

multiplies_array [1, 2, 3, 4] 

두 번째 스타는 약간의 혼란 :

이 동일합니다. 여기서 곱셈 연산자는 다음을 의미합니다.

:은 기호를 나타냅니다. 모든 Enumerable 메서드는 심볼을 바로 가기로 전달할 수 있습니다. 이것은 "이 이름으로 메소드 호출"을 의미합니다.

즉, * 메서드는 numbers 배열의 각 항목에 적용됩니다. 나는 그것은 "모든 요소를 ​​결합 inject.

에 대한 설명서를 참조하십시오이 모두 루비의 마법 :

+0

... 감사합니다! :) –

+0

다른 작은 질문. % w (끝 넘음) .include? (string [index]) % w 란 무엇입니까? –

+1

@JohnOggy 다른 질문으로 게시하십시오. '% w '란 무엇입니까? –

1

에 약간의 실마리를 희망

numbers.inject(1) { |result, number| result * number) } 

: 같은 기호 바로 가기없이 그 선이 보일 것이다 블록이나 메서드 또는 연산자의 이름을 나타내는 기호로 지정된 이진 연산을 적용하여 열거 형을 지정합니다. "

그러므로 :*은 곱셈 연산자를 numbers.inject(1, :*)에 지정하고 있습니다. :*은 심볼로 지정하지만 numbers.inject(1, '*')도 지정할 수 있습니다. 기호를 사용하는 것은 더 관용적입니다.