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

Ruby 为什么没有设置我的节点子节点?,ruby,Ruby,我有下面的代码,不知道是否有人能告诉我为什么在运行它之后,@left\u child和@right\u child的值仍然为零 我想我知道为什么,但我要求向社区确认。还有,有没有一种方法可以让这项工作以这样的方式进行 module BinaryTree class Node attr_accessor :left_child, :right_child def initialize(value) @value = value

我有下面的代码,不知道是否有人能告诉我为什么在运行它之后,
@left\u child
@right\u 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

它们仍然为零,因为您从未为它们赋值。相反,您应该改为:

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

which_child
create_child
的本地变量。调用该方法时,
@right\u child
的值将被复制到它。您的代码基本上与

right_child = nil
which_child = right_child
which_child = true
# right_child is still nil!
Ruby中的变量存储指向对象的指针,Ruby按值传递这些指针。另见: