2011年10月23日日曜日

簡易TreeをRubyで作ってみた

7つの言語7つの世界
という本の2日目の試してみようで作ったソースでも
メモ程度に置いておきます。

後になってみたときに、ひどいコードを書いていたなぁ~
と思えるようにw

class Tree
  attr_accessor :tree, :node_name

  def initialize(tree)
    tree = tree.to_a.first if tree.is_a?(Hash)
    @tree = tree
    @node_name = @tree[0]
  end

  def visit_all(&block)
    visit &block
    visit_all_child(@tree , 0)
  end

  def visit(&block)
    block.call self
  end

  def visit_all_child(children , nest)
    children[1].map do |child|
      for i in 0..nest do
        print " "
      end
      printf("%s\n",child[0])
     
      if child[1] != []
        visit_all_child(child, nest + 1)
      end
    end
  end
end

tree =  {
  'grandpa' => {
    'dad' => {
      'child 1' => [],
      'child 2' => []
    },
    'uncle' => {
      'child3' => [],
      'child4' => []
    },
    'newDad' => {
      'child5' => [],
      'child6' => {
        'child6_1' => [],
        'child6_2' => []
      }
    }
  }
}

ruby_tree =  Tree.new(tree)


puts "Visiting a node"
ruby_tree.visit {|node| puts node.node_name}

puts "Visiting entire node"
ruby_tree.visit_all {|node| puts node.node_name}


実行結果
c:\code>ruby 2-2.rb
Visiting a node
grandpa
Visiting entire node
grandpa
 dad
  child 1
  child 2
 uncle
  child3
  child4
 newDad
  child5
  child6
   child6_1
   child6_2



段々にしたかったので作ったら、なんか微妙な感じになりました。

0 件のコメント:

コメントを投稿