2015-04-24 3 views
1

Привет, ребята У меня вопрос о добавлении методов к объектам экземпляра. Я чего-то не понимаю.Добавление методов к объектам экземпляра

Я пытаюсь создать двоичное дерево поиска в 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} 

Итак, почему этот метод не работает так, как в предыдущем примере?

Благодаря

ответ

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

В рубине значение присваивания переменной является значением, которое вы назначаете. Это означает, что если вы делаете

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 в 2 node. Результатом этого задания является Node 3, который вы назначаете left из Node 1. Снова результат этого задания - Node 3, который вы снова назначаете своей переменной left. Таким образом, в конце он действует так, как будто вы только назначили Node 3 на left, но делаете 2 ненужных экземпляра объекта на пути.

+0

tnx для ответа, но как это работает тогда: tree.left.left = Node.new (7) //// "{10 :: {8 :: {6 :: nil | nil} | nil} | nil}" –

+1

В этом случае вы сначала установите tree = Node10, затем tree.left = Node8. Тогда, если вы tree.left.left = Node.new (7) такое же, как если бы вы сделали а = tree.left # => Узел 8 a.left = Node.new (7) # Что означает, что вы установили узел 7 слева от узла 8 Это отличное от left = Node.new (1) .left = Node.new (2) .left = Node.new (3) –

+0

tnx для вас ответьте Петр, так что вы сказали, что это будет работать 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) - Но как я могу добавить тот же экземплярметод .left с разными новыми объектами с разными значениями в строке, но я не могу сделать это без объекта экземпляра, например дерева? Tnx Tom –

Смежные вопросы