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}
错误消息:(我使用的是 ruby 1.9.2)
C:\ruby>ruby tree.rb
tree.rb:4:in `initialize': wrong number of arguments (2 for 1) (ArgumentError)
block 引用> block 引用> block 引用>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>'
最佳答案
该行有 2 个参数:
@children = v.map { |k,v| Tree.new(k,v) }
也许您想将 k,v
更改为 {k => v}
?
@children = v.map { |k,v| Tree.new(k=>v) }
我认为初始化是有问题的 - 你正在实现什么样的树?
关于ruby树类,为什么它说在初始化中有2个参数而不是1个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6891475/