2011-02-03 57 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給定樹的每個子樹(包括樹本身)。即,block將取Tree並返回任意類型的某個對象B。地圖的結果將爲Tree,標籤類型爲B

回答

3

如果您可以爲您的課程實施each方法,然後include Enumerable,您將繼承各種魔法善良,包括map

執行<=>,你會得到更多。

Enumerable是你的朋友。


編輯:

如果你看看會發生什麼時Hash#map被調用時,哈希轉化爲一個數組的數組:

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

它是由開發者mop-然後再重新構建轉換後的散列。這很容易,因爲Hash[]的工作原理。

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

如果是我,我會寫一個方法來獲取數組數組,並重建你的樹。這樣你的each方法將允許你include Enumerable這將創建map。您可以調用它,然後即時重建樹。看看如何使用Hash#[],你應該爲自己的代碼實現類似的東西。

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(" "))} 

對於樹中的每一個節點,這個地方樹信息形式:

<label> -> <child label 1> <child label 2> <child label 3> 
+0

您是否正在回答您自己的問題或試圖延長原始問題?如果擴展它,請重新編輯您的原始問題並刪除此答案。 – 2011-02-03 01:43:47

+0

這是一個答案。 – dsg 2011-02-03 01:52:37

+0

那麼你的答案與我們的爭論呢?聽起來像是一場輕鬆的勝利。 – 2011-02-03 03:12:45

1

而不是做block.call的()你也可以屈服:

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