Seven Languages in Seven Weeks: Ruby - Tag 2
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');