2011-02-03 3 views
0

루비의 n- 트리에 대해 맵 함수를 작성하려면 어떻게해야합니까?루비 트리 클래스의 맵 함수

class Tree 
    def children() return @children end 
    def label() return @label end 

    def initialize(label, children) 
    @label = label 
    @children = children 
    end 

    def map(&block) 
    # TODO 
    end 
end 

(공지 사항 children는 임의의 목록 (반드시 길이 <의 = 2)입니다.)

내가 함수 작성하려면 : map(&block), 주어진 트리의 모든 하위 트리에 block을 적용 (포함 나무 그 자체). 즉, blockTree을 받아 임의 유형의 객체 인 B을 반환합니다. 지도의 결과는이고 레이블은 B입니다.

답변

3

클래스에 each 메소드를 구현할 수 있다면 include Enumerable을 사용하면 map을 비롯한 모든 종류의 마법적 장점을 상속 받게됩니다.

<=>을 구현하면 더 많은 것을 얻을 수 있습니다.

Enumerable은 (는) 친구입니다.


편집 :

>> hash = {'a' => 1, 'b' => 2} #=> {"a"=>1, "b"=>2} 
>> hash.map{|n| n} #=> [["a", 1], ["b", 2]] 

그것은 mop-하는 것은 개발자의 몫이다 : 당신이 호출 될 때 Hash#map 어떻게되는지를 보면, 해시는 배열의 배열로 변환된다

이후에 선택적으로 변환 된 해시를 다시 빌드하십시오. Hash[]의 작동 방식 때문에 쉽습니다.

>> Hash[*hash.map{|n| n}.flatten] #=> {"a"=>1, "b"=>2} 

내가 저라면, 배열 배열을 가져 와서 트리를 다시 작성하는 방법을 쓰겠습니다. 그런 식으로 귀하의 each 방법 include Enumerablemap 만들 수 있습니다. 그걸 부르면 즉시 나무를 재건 할 수 있습니다. Hash#[]이 어떻게 사용되는지 살펴보고 코드와 비슷한 것을 구현해야합니다.

+0

불행히도, 이것은 효과가없는 것 같습니다. 지도의 결과는 나무가 아닙니다. 당신은 당신의 솔루션에 대해 더 명백하게 표현할 수 있습니까? – dsg

+0

'each '를 구현하는 것은 클래스의 내부 구조에 달려 있습니다.샘플 코드에는 트리 작성 방법이나 기반으로하는 내용이 표시되어 있지 않습니다. 이 정보가 없으면 더 많은 정보를 제공 할 방법이 없습니다. –

+0

예를 들어, float 트리를 구성 할 때 (각 레이블은 float이고 children은 그러한 트리의 배열입니다) 't'를 호출 할 수 있도록 'each'를 구현하고 싶습니다. .map {| x | -x.label}'은't '와 동일한 새로운 트리를 리턴하지만 각 레이블의 값은 무효화됩니다. 어떻게 '각자'가 그렇게 작동하도록 정의 할 수 있습니까? – dsg

1
def map(&block) 
    Tree.new(block.call(self), children.map{|x| x.map(&block)})  
end 

가 여기에 사용 예이다 :

t.map{|x| puts(x.label + " -> " + x.children.map{|i| i.label}.join(" "))} 

트리의 모든 노드에 대해, 형태로이 지역의 트리 정보 :

대신 block.call을하는
<label> -> <child label 1> <child label 2> <child label 3> 
+0

질문에 대답 하시거나 원래 질문을 연장 하시겠습니까? 그것을 연장하는 경우 원래 질문을 다시 편집하고이 대답을 삭제하십시오. –

+0

이것은 답변입니다. – dsg

+0

당신의 대답은 우리와 관련이 있습니까? 쉬운 승리처럼 들립니다. –

1

()

def map(&block) 
    yield self 
    children.each {|child| child.map(&block)} 
    end 
+0

코드는 실제로'map'이 아니라'each'를 구현합니다. – sepp2k

+0

어. 네가 옳아. 그것이 내가 대답을 서둘 렀기 때문에 얻는 것입니다. 그것을 잡아 주셔서 감사합니다. (내가 투표 할 수 없다고 믿을 수 없다!) –