2009-02-01 2 views

ответ

11

Чтобы расширить ответ Отто, легкий способ получения хэша для автоматического оживлять массивов заключается в использовании блока значение по умолчанию с Hash::new, например, так:

node_children = Hash.new { |_node_children, node_key| _node_children[node_key] = [] } 

Но на самом деле, код зависит от того, что вы хотите делать с вашими массивами. Вы можете установить их с хэши и массивы, или сделать несколько классов:

class Node 
    attr_accessor :value, :children 
    def initialize(value, children=[]) 
     @value = value 
     @children = children 
    end 
    def to_s(indent=0) 
     value_s = @value.to_s 
     sub_indent = indent + value_s.length 
     value_s + @children.map { |child| " - " + child.to_s(sub_indent + 3) }.join("\n" + ' ' * sub_indent) 
    end 
end 

ROOT = Node.new('root', %w{ farleft left center right farright }.map { |str| Node.new(str) }) 
puts "Original Tree" 
puts ROOT 
puts 

ROOT.children.each do |node| 
    node.children = %w{ one two three four }.map { |str| Node.new(node.value + ':' + str) } 
end 
puts "New Tree" 
puts ROOT 
puts 

Этот код, например, дает:

Original Tree 
root - farleft 
    - left 
    - center 
    - right 
    - farright 

New Tree 
root - farleft - farleft:one 
       - farleft:two 
       - farleft:three 
       - farleft:four 
    - left - left:one 
      - left:two 
      - left:three 
      - left:four 
    - center - center:one 
       - center:two 
       - center:three 
       - center:four 
    - right - right:one 
      - right:two 
      - right:three 
      - right:four 
    - farright - farright:one 
       - farright:two 
       - farright:three 
       - farright:four 
5

Хэш, чьи атрибуты - все массивы?

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