大家好我有关于向实例对象添加方法的问题。有些事情我没有得到。
我正在尝试在Ruby中创建二进制搜索树。 所以我创建了一个类似的节点类:
class Node
attr_accessor :value, :right, :left
def initialize(value)
@value = value
end
end
因此,当我想从该类创建实例对象时,我会这样做:
tree = Node.new(10)
但是如果我想创建一个二叉搜索树,我需要左右指针,以获得比我的根数更少和更高的值。
所以这应该是这样的。
tree.left = Node.new(8)
tree.right = Node.new(13)
如果我想更进一步,我会这样做:
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}
那么,为什么这个方法的链接不像上一个例子那样工作呢?
由于
答案 0 :(得分:1)
tap
会对您的情况有所帮助:
left = Node.new(1).tap do |n|
n.left = Node.new(2).tap do |n|
n.left = Node.new(3)
end
end
关于如何使用tap
方法的好文章。
试一试,让它知道它是否有效!
祝你好运!答案 1 :(得分:1)
在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)
分配给left
的{{1}}。此作业的结果是2 node
,您将其分配给Node 3
的{{1}}。此分配的结果再次为left
,您再次将其分配给变量Node 1
。所以最后它就像你刚刚将Node 3
分配给left
,但在途中做了2个不必要的对象实例化。