2011-02-03 62 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