2017-02-23 47 views
0

Назовите меня новичком/noob, это мой первый раз с OO, с деревьями и с Ruby. Однако, я думал, что я мог бы добавить узел к ранее созданному один, как это делается в следующем фрагменте:Rubytree Tree :: TreeNode.new не работает для узла без полномочий root

#!/usr/bin ruby 
# simple_trial_tree.rb 

require 'tree' 
root_node = Tree::TreeNode.new("origin", "Push button") 
root_node << Tree::TreeNode.new("assets", "assets") 
root_node.print_tree 

хорошо печатает это минимальное дерево:

* origin 
+---> assets 

Но тогда, если Я пытаюсь добавить так же, как ребенок к узлу assets, например, так:

require 'tree' 
root_node = Tree::TreeNode.new("origin", "Push button") 
root_node << Tree::TreeNode.new("assets", "assets") 
assets << Tree::TreeNode.new("assets_av", "av") 
root_node.print_tree 

я simple_trial_tree.rb:17:in ``<main>': undefined local variable or method ``assets' 'for main:Object (NameError) (с двойными обратными клещами быть г как единичные). Однако следующий способ действительно работает:

require 'tree' 
root_node = Tree::TreeNode.new("origin", "Push button") 
assets = Tree::TreeNode.new("assets", "assets") 
root_node.add(assets) 
assets_av = Tree::TreeNode.new("assets_av", "av") 
assets.add(assets_av) 
root_node.print_tree 

и дает:

* origin 
+---+ assets 
    +---> assets_av 

Теперь я немного запутался, как в the manual of Rubytree целом ветвь с узлами могут быть добавлены в «о» пути Я попробовал это сделать (я думаю, проблема кроется в «о»). Что я здесь делаю неправильно?

+0

где в руководстве вы видите использование переменной перед ее определением? – niceman

+0

Это была путаница. Я видел узел, вставленный перед его определением, и я предположил, что вставка также является определением с первой переменной как ее именем, определяющим сам узел. – HarryH

ответ

0

вы не можете получить доступ к переменной до ее определения. Это также упоминается в руководстве.

# ..... Create the root node first. Note that every node has a name and an optional content payload. 
root_node = Tree::TreeNode.new("ROOT", "Root Content") 
root_node.print_tree 

# ..... Now insert the child nodes. Note that you can "chain" the child insertions for a given path to any depth. 
root_node << Tree::TreeNode.new("CHILD1", "Child1 Content") << Tree::TreeNode.new("GRANDCHILD1", "GrandChild1 Content") 
root_node << Tree::TreeNode.new("CHILD2", "Child2 Content") 

# ..... Lets print the representation to stdout. This is primarily used for debugging purposes. 
root_node.print_tree 

# ..... Lets directly access children and grandchildren of the root. The can be "chained" for a given path to any depth. 
child1  = root_node["CHILD1"] 
grand_child1 = root_node["CHILD1"]["GRANDCHILD1"] 
+0

Порядок первой вставки несуществующих дочерних заметок и определения их только после этого был немного запутанным, и я до сих пор не понимаю, как они могут это сделать. Благодарю. – HarryH

0

Вы делаете это неправильно. Вы должны сделать что-то вроде этого:

require 'tree' 
root_node = Tree::TreeNode.new("origin", "Push button") 
another_node = Tree::TreeNode.new("assets", "assets") 
root_node << another_node 
another_node << Tree::TreeNode.new("assets_av", "av") 
root_node.print_tree 

Случается, что «активы», это название вашего второго узла, а не его имя переменной.

Когда вы использовали root_node << Tree::TreeNode.new("assets", "assets"), вы не присвоили этому узлу «активы» переменной. Тогда вы просто не можете упоминать об этом в других частях вашего кода. Заголовок является свойством этого узла, а не именем переменной.

+0

Да, я понимаю, что вы имеете в виду, спасибо. – HarryH

+0

Добро пожаловать. –

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