У меня огромные проблемы с извлечением элементов из хеша node_hash
в приведенном ниже коде. Хеш содержит узлы филогенетического дерева, построенные из доступных данных здесь . Каждый узел имеет уникальный идентификатор, который является ключом хэша. Когда я пытаюсь получить доступ к элементу хеша, например, node_hash[10]
, Руби просто раскручивает свои колеса и не может получить его. Однако, если я сделаю что-то вроде node_hash[10].name
, имя вернется. Я знаю, что устанавливаются правильные отношения, потому что я могу сделать что-то вроде
node_hash[1].children.each do |child|
puts child.name
end
И я получаю ожидаемый результат
root
Viruses
Viroids
unclassified sequences
other sequences
cellular organisms
но потом он просто ждет после распечатки всего этого. Вот полный код.
class Node
attr_accessor :name, :kind, :children, :parent
def initialize(name=nil, kind=nil, children=nil, parent=nil)
@name = name
@kind = kind
@parent = parent
if children
@children = children
else
@children = []
end
end
def add_child(child)
@children << child
end
end
node_hash = {}
File.open("taxdump/names.dmp", "r") do |name_file|
name_file.each_line do |line|
split_line = line.split("|")
if split_line[3].include? 'scientific name'
id_num = Integer(split_line[0])
name = split_line[1].strip
node_hash[id_num] = Node.new(name)
end
end
end
File.open("taxdump/nodes.dmp", "r") do |node_file|
node_file.each_line do |line|
split_line = line.split("|")
id_num = Integer(split_line[0].strip)
par_id = Integer(split_line[1].strip)]
child = node_hash[id_num]
parent = node_hash[par_id]
child.parent = parent
child.kind = split_line[2].strip
parent.add_child(child)
end
end
РЕДАКТИРОВАТЬ: Так что я просто позволил одному из узлов загрузить, и примерно через минуту было напечатано то, что было похоже на всю структуру дерева. Кажется, что Ruby рекурсивно идет по дереву (отображая родителя узла и его потомков, потом родителя родителя и его потомков и т. Д. Я попытаюсь переопределить inspect
. Надеюсь, это будет работать.
РЕДАКТИРОВАТЬ 2: Это добилось цели.