2013-03-19 2 views
0

각 메소드의 사용법이 동일하고 동일한 출력을내는 Ruby를 배워 나가는 동안 Ruby가 어떻게되는지 궁금합니다. (그리고 내 자신의 함수에서 어떻게 만들 수 있는지 궁금합니다.)Ruby : 오버로드 수율 함수

my_array = [["hello","goodbye"],["picture","perfect"]] 

my_array.each do |array| 

    puts array[0] + " " + array[1] 

end 

my_array.each do |first, second| 

    puts first + " " + second 

end 

내 이해 코드 블록을 허용하는 방법에 대한 정의를 기록 할 때, 항복 방법은 코드 블록에 대한 인수를 전달하고 블록을 호출하는데 이용된다는 것이다. 그렇다면 yield 메소드를 어떻게 활용하여 제공된 코드 블록에 따라 다른 인수를 전달할 수 있습니까? 예제에서 yield 메소드는 두 개의 매개 변수 (즉, first, second)가 블록 내에서 사용될 때 개별 배열 요소를 전달하고 블록 내에서 하나의 매개 변수가 사용될 때 배열 자체를 전달합니다 (즉, array).

+0

@RoneyMichael 내가 틀렸다면 정정 해주세요. 그러나 나는 그것이 해결책이라고 생각하지 않습니다. splat 연산자는 인수가 아닌 매개 변수와 함께 사용됩니다. 그리고 제 질문은 제가 항복 선언문을 구조화하는 방법과 제가 그들에게 전달한 논증에 관한 것입니다. – voltair

+0

아 맞다! 내 잘못이야. –

답변

1

아니요 each 아니요 yield도 여기에서 특별한 작업을 수행하고 있습니다. 블록 인수가 작동하는 방식입니다. 이 간단한 예를 고려해

def f(x) yield x end 

을 지금 우리는 어떻게 볼 수 있습니다 : 당신은 할당 비슷한 자폭를 볼 수 있습니다

>> f([1,2]) { |a| puts a.inspect } 
[1, 2] 
>> f([1,2]) { |a, b| puts "#{a} - #{b}" } 
1 - 2 
>> f([1,2]) { |a, b, c| puts "#{a} - #{b} - #{c}" } 
1 - 2 - 

:

a, b = [1, 2] 

또한 명시 적으로 그것을 할 수 있습니다 a 표시 :

a, b = *[1, 2] 

또는이 같은 :

def g(x) yield *x end 
g([1, 2]) { |a, b| puts "#{a} - #{b}" } 

아마도 블록이 블록이 아니라 인수를 풀고 위치 있도록이 주어집니다 것들을 정렬 알고

. g 함수는 인수가 splatable (배열)이지만 f은 그렇지 않음을 알아야합니다. f은 " x"의 어떤 종류의 로직을 f이라는 호출에 함께 넣으면 g 자체가 로직의 절반을 차지합니다.

{ :where => :is, :pancakes => :house? }.map { |k, v| ... } 
Enumerable#map는 해시 키/값 두 요소 배열에서 작동하는지 알 필요가 없다

, 그것은 단지 주변 사물과 잎을 통과 : 당신이 해시에 Enumerable에서 방법을 사용할 때의 차이가 분명하게 한 장소입니다 세부 사항에 대해 걱정하는 것은 다른 모든 사람들에게 그렇습니다.

+0

답변 해 주셔서 감사합니다. 그래서 내가 루비가 배열과 해시 같은 객체를 자동으로 감지하고 해체 시키거나 해체하지 않는 규칙을 볼 수있는 곳이 있습니까? 아니면 실제로 배열과 해시와 관련이있는 것 같으므로 시행 착오를 통해 방금 배울 수 있습니까? 또한 g 메소드의 경우 yield 함수에서 splat는 g에 전달 된 인수가 배열이 아닌 경우 오류가 발생한다는 의미입니까? 그리고 배열 splatable입니까? 당신이 추측 한 것 같았지만 확실하지 않았습니다. – voltair

+0

@ user1419674 : 배열 만 블록 인수에 자동 표시/비 정렬됩니다. ['Enumerable'] (http://ruby-doc.org/core-2.0/Enumerable.html) ('map'과 친구들의 소스)와 뭔가 상호 작용하는 것을보고 싶다면 다음을 확인해야합니다 클래스의 문서 –