Loop through a tree
class Tree attr_reader :value def initialize(value) @value = value @children = [] end def <<(value) subtree = Tree.new(value) @children << subtree return subtree end def each yield value @children.each do |child_node| child_node.each { |e| yield e } end end end t = Tree.new("Parent") puts child1 = t << "Child 1" puts child1 << "Grandchild 1.1" puts child1 << "Grandchild 1.2" puts child2 = t << "Child 2" puts child2 << "Grandchild 2.1" t.each { |x| puts x } # Parent # Child 1 # Grandchild 1.1 # Grandchild 1.2 # Child 2 # Grandchild 2.1