向实例对象

时间:2015-04-24 09:55:52

标签: ruby methods instance

大家好我有关于向实例对象添加方法的问题。有些事情我没有得到。

我正在尝试在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} 

那么,为什么这个方法的链接不像上一个例子那样工作呢?

由于

2 个答案:

答案 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个不必要的对象实例化。