 
 This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Writing an Iterator Over a Data Structure | ||
|---|---|---|
| Code | Expected | Actual | 
| class Tree
  attr_reader :value
  def initialize(value)
    @value = value
    @children = []      
  end
  def <<(value)
    subtree = Tree.new(value)
    @children << subtree
    return subtree
  end
end
t = Tree.new("Parent")
child1 = t << "Child 1"
child1 << "Grandchild 1.1"
child1 << "Grandchild 1.2"
child2 = t << "Child 2"
child2 << "Grandchild 2.1"
class Tree
  def each
    yield value
    @children.each do |child_node| 
      child_node.each { |e| yield e }
    end
  end
end
t.each { |x| puts x } | Parent Child 1 Grandchild 1.1 Grandchild 1.2 Child 2 Grandchild 2.1 | Parent Child 1 Grandchild 1.1 Grandchild 1.2 Child 2 Grandchild 2.1 | 
| class Array
 def each_from_both_sides()
    front_index = 0
    back_index = self.length-1
    while front_index <= back_index
      yield self[front_index]
      front_index += 1
      if front_index <= back_index
	yield self[back_index]
        back_index -= 1
      end
    end
  end  
end
%w{Curses! been again! foiled I've}.each_from_both_sides { |x| puts x } | Curses! I've been foiled again! | Curses! I've been foiled again! | 
| module Enumerable
  def each_n_times(n)
    each { |e| n.times { yield e } }
  end
end
%w{Hello Echo}.each_n_times(3) { |x| puts x } | Hello Hello Hello Echo Echo Echo | Hello Hello Hello Echo Echo Echo | 
| module Enumerable
  def each_randomly	
    (sort_by { rand }).each { |e| yield e }
  end
end
%w{Eat at Joe's}.each_randomly { |x| puts x } | Eat Joe's at | Eat Joe's at |