2011-07-31 14 views
2
class Tree 
attr_accessor :children, :node_name 

def initialize(tree_hash={}) 
    tree_hash.each do |k,v| 
     @node_name = k 
     @children = v.map { |k,v| Tree.new(k,v) } 
    end 
end 

def visit_all(&block) 
    visit &block 
    children.each {|c| c.visit_all &block} 
end 

def visit(&block) 
    block.call self 
end 
end 

ruby_tree = Tree.new({'grandpa' => {'dad' => {'child 1' => {}, 'child 2' => {} },'uncle' => {'child 3' => {}, 'child 4' => {} } } }) 

puts "Visiting a node" 
ruby_tree.visit {|node| puts node.node_name} 
puts 

puts "visiting entire tree" 
ruby_tree.visit_all {|node| puts node.node_name} 

和錯誤消息:(我使用紅寶石1.9.2)紅寶石樹類,爲什麼它說在初始化時有2個參數而不是1?

C:\紅寶石>紅寶石tree.rb

tree.rb:4:在`初始化」 :錯誤的參數數目(2 1)(引發ArgumentError)

from tree.rb:7:in `new' 
    from tree.rb:7:in `block (2 levels) in initialize' 
    from tree.rb:7:in `each' 
    from tree.rb:7:in `map' 
    from tree.rb:7:in `block in initialize' 
    from tree.rb:5:in `each' 
    from tree.rb:5:in `initialize' 
    from tree.rb:21:in `new' 
    from tree.rb:21:in `<main>' 

回答

3

有2個ARGS在該行:

@children = v.map { |k,v| Tree.new(k,v) } 

也許你想改變k,v{k => v}

@children = v.map { |k,v| Tree.new(k=>v) } 

我覺得初始化是有問題的 - 雖然 - 你在實施什麼樣的樹?

+0

我想從哈希實現一棵樹。你可以在ruby_tree變量中看到一個例子。 – stanm87

+0

我認爲這是一棵二叉樹?大多數教科書實現將節點的邏輯封裝在單獨的類中。但是,您需要執行一個根節點和左右子節點的概念。使用哈希實例化您的樹可能會變得非常脆弱。 –

+0

這是7周內編程書籍7種編程語言的練習。目標是實現Tree類,以便它接受一個Hash作爲用戶界面。這意味着它們將是哈希中的1個根節點。感謝您的回答,它現在正在工作 – stanm87