Ruby 向实例对象添加方法

Ruby 向实例对象添加方法,ruby,methods,instance,Ruby,Methods,Instance,大家好,我有一个关于向实例对象添加方法的问题。有些事我不明白 我正在尝试用Ruby做一个二进制搜索树。 所以我创建了一个节点类,如下所示: class Node attr_accessor :value, :right, :left def initialize(value) @value = value end end 因此,当我想从该类创建实例对象时,我会执行以下操作: tree = Node.new(10) tree.left.left =

大家好,我有一个关于向实例对象添加方法的问题。有些事我不明白

我正在尝试用Ruby做一个二进制搜索树。 所以我创建了一个节点类,如下所示:

class Node
    attr_accessor :value, :right, :left

    def initialize(value)
        @value = value  
    end
end
因此,当我想从该类创建实例对象时,我会执行以下操作:

tree = Node.new(10)
tree.left.left = Node.new(7)
但是,如果我想创建一个二叉搜索树,我需要左指针和右指针,用于小于或大于我的根数的值

所以应该是这样的

tree.left = Node.new(8)
tree.right = Node.new(13)
如果我想更进一步,我会这样做:

tree = Node.new(10)
tree.left.left = Node.new(7)
根据我采用的检查方法,我得出以下结论:

"{10::{8::{6::nil|nil}|nil}|nil}" 
但从这一点来看:

left=Node.new(1).left = Node.new(2).left = Node.new(3)
我得到:

{3::nil|nil} 
那么,为什么这个链接方法不能像上一个例子那样工作呢


谢谢

轻触
将对您的情况有所帮助:

left = Node.new(1).tap do |n|
  n.left = Node.new(2).tap do |n|
    n.left = Node.new(3)
  end
end
关于如何使用该方法的文章很好

试一试,看看是否有效


祝你好运

在ruby中,为变量赋值的值就是您正在赋值的值。这意味着如果你这样做

a = 5
该表达式的值为5。此外,作业是从右到左完成的。这意味着在代码中:

left=Node.new(1).left = Node.new(2).left = Node.new(3)

首先创建
Node.new(3)
,然后创建Node.new(2),并将
Node.new(3)
分配给
2节点的
左侧
。此分配的结果是
节点3
,您将其分配给
节点1
左侧
。同样,此赋值的结果是节点3,您再次将其赋值给变量
left
。因此,最后,它的行为就像您刚刚将
节点3
分配给
左侧
,但同时执行了两个不必要的对象实例化

tnx的答案,但这是如何工作的:tree.left.left=Node.new(7)//“{10::{8::{6::nil}| nil}| nil}”在这种情况下,首先设置tree=Node10,然后设置tree.left=Node8。然后,如果你做了tree.left.left=Node.new(7)和你做了a=tree.left#=>Node 8 a.left=Node.new(7)#,这意味着你将Node 7设置为Node 8的左侧,这与left=Node.new(1)不同。left=Node.new(2)。left=Node.new(3)tnx对于你来说,回答Piotr,你的意思是这会起作用,left=Node.new(1).left=Node.new(2).left=Node.new(3)-如果我在一个实例对象上这样做,比如tree=Node.new(10),比如下面的tree.left=Node.new(1).left=Node.new(2).left=Node.new(3)-但是我怎么可以附加相同的实例方法。在一行中有不同的新对象和不同的值,但如果没有像树这样的实例对象,我就不能这样做?Tnx汤姆