Может извлекать атрибуты элементов в хэше в Ruby, но не сами элементы - PullRequest
0 голосов
/ 09 марта 2012

У меня огромные проблемы с извлечением элементов из хеша 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: Это добилось цели.

1 Ответ

0 голосов
/ 11 марта 2012

Итак, я просто позволил одному из узлов загрузиться, и примерно через минуту было напечатано то, что выглядит как вся структура дерева.Руби рекурсивно прошла по дереву (отображая родителя узла и его потомков, потом родителя родителя и его потомков и т. Д. Генерация строки была тем, что занимало так много времени. Переопределение inspect для изменения способа отображения каждого узла решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...