Wie im Buch versprochen wird das Tempo noch einmal angezogen und nur die wichtigsten Dinge näher zu bringen.

Jedes der drei Beispiele von Heute hat seine ganz eigenen Stolpersteine. Zum Beispiel die erste Aufgabe ein each_slice nur mit each selbst zu schreiben ist zwar auf den ersten Blick ganz simpel aber auch hier liegt der Teufel im Detail.

#!/usr/bin/ruby
# Autor: Jan Seeger
# Mail: jan@alphadev.net
# Web: jan.alphadev.net
#
# each_slice.rb
# Task of 2nd Day, Seven Languages in Seven Weeks

a = (1..16).to_a;
result = []

a.each { |x|
  result.push(x);
  (print result; result = [])  if result.length ==4
}

print "\n";
print a.each_slice(4) {|y| print y};

Ich habe es einfach nicht hinbekommen die Variablendeklaration in der zweiten Zeile in die Schleife zu bekommen. Selbst mit defined?(result) wollte es nicht klappen. Für diese vermeintlich einfache Aufgabe sind erstaunlich viele Versuche drauf gegeangen. Aber vielleicht habe ich auch einfach den falschen Blickwinkel auf das Problem und Ruby hat (außer each_slice) einen einfachen, sauberen weg das Problem zu lösen.

Die Tree-Aufgabe ging dann wieder leichter von der Hand, auch wenn es mir einfach nicht gefallen will, dass der Autor hier die Anzeigelogik von außen rein gibt, auch wenn es nur der Veranschaulichung dient.

#!/usr/bin/ruby
# Autor: Jan Seeger
# Mail: jan@alphadev.net
# Web: jan.alphadev.net
#
# tree.rb
# Task of 2nd Day, Seven Languages in Seven Weeks

class Tree
  attr_accessor :children, :node_name, :depth

  def initialize(tree, name="root", depth=0)
    @children = [];
    @depth = depth;
    @node_name = name;
    tree.each { |key, val| @children.push(Tree.new(val, key, depth+1)) }
  end

  def visit_all(&block)
    visit &block
    children.each{|c| c.visit_all &block }
  end

  def visit(&block)
    block.call self
  end
end

data  = {'grandpa' => { 'dad' => {'child 1' => {}, 'child 2' => {} }, 'uncle' => { 'child 3' =>$
ruby_tree = Tree.new(data)

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

puts
puts "visiting entire tree"
ruby_tree.visit_all do |node|
  node.depth.times{ print "  " }
  puts node.node_name
end

Das dritte Beispiel ging mit ein wenig Hilfe der RDoc, in deren Bedienung ich mich langsam aber sicher eingewöhne, gut von der Hand. Ich habe als Test-Datei ein Lorem ipsum benutzt, das ihr euch beim Lorem Ipsum Generator holen könnt.

#!/usr/bin/ruby
# Autor: Jan Seeger
# Mail: jan@alphadev.net
# Web: jan.alphadev.net
#
# grep.rb
# Task of 2nd Day, Seven Languages in Seven Weeks

def grep(file, term)
  line = 0;

  # Datei öffnen und Zeile für Zeile ausgeben
  File.open(file, "r").readlines.each do |x|
    line = line +1;

    # Zeile ausgeben, wenn übereinstimmung gefunden
    print "Line " + line.to_s + ": " + x if x.match(term)
  end
end

grep('lorem_ipsum.txt', 'dolore');