未定义的局部变量或方法' name'

时间:2015-10-11 16:11:23

标签: ruby

下面是一个实现树的程序。

class Tree
    attr_accessor :children, :node_name

    def initialize(name_children=[])
        @children = children
        @node_name = name
    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( "Ruby", [Tree.new("Reia"), Tree.new("MacRuby")] )

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_tree = Tree.new( "Ruby", [Tree.new("Reia"), Tree.new("MacRuby")] )

我收到的错误是

tree.rb:6:in `initialize': undefined local variable or method `name' for #<Tree:0x007f94020249f8 @children=nil> (NameError)
from tree.rb:19:in `new'
from tree.rb:19:in `<main>'

任何帮助都会很棒。

4 个答案:

答案 0 :(得分:3)

您的initialize方法中有一个拼写错误,只接受一个名为name_children的参数,但从该方法的主体看,下划线应该是逗号 - name, children

答案 1 :(得分:1)

问题在于第6行@node_name = name。你在哪里定义那个变量?

答案 2 :(得分:0)

在构造函数中,(初始化),为什么不输入变量children,并且这样命名而不是children_name?在我看来,当你试图通过创建对象来实例化类时,当它进入初始化构造函数时,它在那里找不到名字。

def initialize(name, children=[])
    @children = children
    @node_name = name
en

答案 3 :(得分:0)

由于您在模型中定义了attr_accessor:name,因此您必须在模型中定义Children方法,如

{{1}}