为什么我的节点孩子都没有设置?

时间:2014-06-23 19:19:28

标签: ruby

我有以下代码,并且想知道是否有人可以告诉我为什么在运行它之后,@left_child@right_child的值仍为零。

我想我知道为什么,但我要求向社区确认。另外,有没有办法让我的工作方式像这样?

 module BinaryTree
    class Node
        attr_accessor :left_child, :right_child

        def initialize(value)
            @value = value
            @left_child = nil
            @right_child = nil
        end

        def add_child(value)
            if value > @value
                create_child(value, @right_child)
            else
                create_child(value, @left_child)
            end
        end

        private

        def create_child(value, which_child)
            if which_child.nil?
                which_child = Node.new(value)
            else
                which_child.add_child(value)
            end
        end
    end
end

node = BinaryTree::Node.new(50)

node.add_child(20)
node.left_child # => nil

node.add_child(70)
node.right_child # => nil

2 个答案:

答案 0 :(得分:0)

它们仍然是零,因为您从未为它们分配值。相反,你应该改为:

module BinaryTree
  class Node
    attr_accessor :left_child, :right_child

    def initialize(value)
      @value = value
      @left_child = nil
      @right_child = nil
    end

    def add_child(value)
      if value > @value
        @right_child = create_child(value, @right_child)
      else
        @left_child = create_child(value, @left_child)
      end
    end

    private

    def create_child(value, which_child)
      if which_child.nil?
        which_child = Node.new(value)
      else
        which_child.add_child(value)
      end
      which_child
    end
  end
end

答案 1 :(得分:0)

which_childcreate_child的本地变量。调用方法时,@right_child的值正在复制。您的代码与

基本相同
right_child = nil
which_child = right_child
which_child = true
# right_child is still nil!

Ruby中的变量存储指向对象的指针,Ruby通过 value 传递这些指针。另见: