【问题标题】:ruby tree class, why does it says there is 2 arguments instead of 1 in initialize?ruby 树类,为什么它说初始化时有 2 个参数而不是 1?
【发布时间】:2011-07-31 18:33:37
【问题描述】:
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>红宝石树.rb

tree.rb:4:in `initialize': 参数数量错误(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>'

【问题讨论】:

    标签: ruby


    【解决方案1】:

    该行有 2 个参数:

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

    也许您想将k,v 更改为{k =&gt; v}

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

    我认为初始化是有问题的 - 你在实现什么样的树?

    【讨论】:

    • 我想从哈希中实现一棵树。您可以在 ruby​​_tree 变量中看到一个示例。
    • 我猜它是二叉树?大多数教科书实现将节点的逻辑封装在一个单独的类中。不管你怎么做,你需要一些强制单个根节点和左右子节点的概念。用哈希实例化你的树可能会变得非常脆弱。
    • 这是一本名为 7 周内 7 种编程语言的编程书籍的练习。目标是实现 Tree 类,使其接受 Hash 作为用户界面。暗示它们将是哈希中的 1 个根节点。感谢您的回答,它正在工作中
    猜你喜欢
    • 1970-01-01
    • 2020-02-28
    • 2013-09-18
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多