2011-11-11 2 views
2

사용자 지정 클래스와 함께 조합 메서드를 사용하려고합니다. 블록이있는 메서드의 래퍼

내 클래스는 다음과 같습니다 경우

...

class MyClass 
    def initialize 
    @data = [] 
    end 
    def to_a 
    @data 
    end 
end 

나는이 부를 수있는 ...

myobj = MyClass.new 
myobj.to_a.combination(2) {|a,b| puts "#{a} #{b}" } 

하지만 차라리이있을 거라고 ...

myobj.combination {|a,b| puts "#{a} #{b}" } 

블록을 전달하면서 결합 메소드를 래핑하는 클래스 메소드를 작성하려고했습니다. 하지만 작동하지 않습니다.

def combination(&block) 
    @data.to_a.combination(2) block.call 
end 

또한 조합이 Array 클래스에 있고 Enumerable이 아닌 이유를 아는 사람이 있습니까? 나는 그곳에서 더 유용했을 거라고 생각했을거야.

+1

클래스가 너무 많은 배열을 ressembles 경우, 왜 배열에서 상속하지? – tokland

+0

"조합이 Array 클래스에 있고 Enumerable이 아닌 이유는 무엇입니까?" 요소의 조합을 만들기 위해서는 모든 요소가 미리 필요합니다. 그래서 Array에이 요소가 있어야하는 이유입니다. 따라서이 메서드는이 클래스에 있습니다. 물론 Enumerable 대신 내부적으로 배열 변환을 수행 할 수 있지만 devs는 이것이 더 명확 할 것이라고 생각합니다. – tokland

+0

@tokland 나는 그것에 대해 생각했지만, 나는 모든 Array 메서드를 원하지 않았다. 또한이 문제를 해결하는 방법을 배우고 싶었습니다. 물론 – Craig552uk

답변

4

이 블록은 Array # 조합에 대한 특수 유형의 매개 변수입니다 (사용자 정의 에서처럼). 올바른 호출은 다음과 같습니다

def combination(&block) 
    @data.to_a.combination(2, &block) 
end 
+0

환상적인 당신 감사합니다! – Craig552uk

+0

사소한 세부 사항 : @data가 이미 배열 인 것으로 보이는 질문에서 to_a가 필요하지 않습니다. – tokland

+0

@tokland 좋은 장소! – Craig552uk

0

이 시도 :

def combination(&block) 
    @data.to_a.combination(2) { block } 
end 
+0

이것이 작동하지 않는다면, 당신은'block.call'을 의미합니까? 블록을 직접'조합 '에 보내는 것은 어쨌든 덜 장황하다. – tokland

관련 문제