|
|||
-r debug startet, zusammen mit allen anderen sonst noch nötigen Optionen und dem Namen des Skripts:
ruby -r debug [options][programfile][arguments] |
readline-Support angeschaltet ist, kann man mit dem Cursor
vorwärts und rückwärts in der Kommando-History springen und man kann vorherige Eingaben zeilenweise ändern.
Um ein wenig zu zeigen, wie der Ruby-Debugger arbeitet, hier ein üblicher Ablauf.
% |
irb [irb-options][ruby_script][options] |
% irb irb(main):001:0> |
Figur 12.1 irb-Beispiel-Session
Eine komplette Beschreibung aller Kommandos, die irb unterstützt, gibts ab Seite 523.
Wie beim Debugger kann man, wenn die Version von Ruby mit GNU-Readline-Support erzeugt wurde, die Pfeil-Tasten benutzen (wie beim Emacs) oder vi-ähnliche Tasten-Kombinationen, um einzelne Zeilen zu editieren oder um zurück zu gehen und eine frühere Zeile neu auszuführen --- gerade wie bei einer Command-Shell.
irb eignet sich prima zum Lernen: es ist sehr bequem, wenn man eine Idee schnell ausprobieren möchte, um zu sehen ob sie funktioniert.
Meta-| an Ruby zur Ausführung weitergeben. Der Ruby-Interpreter nimmt diesen Bereich als Standard-Input und der Output geht in einen Puffer mit Namen ``*Shell Command Output*.'' Diese Fähigkeit konnten wir sehr gut beim Schreiben dieses Buches gebrauchen --- wir haben einfach mitten im Kapitel ein paar Zeilen Ruby-Code selektiert und sie ausprobiert!
Man kann etwas ähnliches im vi-Editor machen mit ``:!ruby'', das ersetzt den Progamm-Text durch seinen Output, oder mit
``:w
!ruby'', das zeigt den Output an, ohne den Puffer zu belasten. Andere Editoren besitzen ähnliche Möglichkeiten.
Wo wir gerade dabei sind, sollten wir an dieser Stelle noch erwähnen, dass es da einen Ruby-Mode für den Emacs gibt, als misc/ruby-mode.el in der Distribution. Es gibt auch im Internet verschiedene Syntax-Highlighting-Module für vim (eine verbesserte Version von vi), jed und andere Editoren. Bei Ruby FAQ findet man die aktuellen Orte und ihre Verfügbarkeit.
setter= als eine Zuweisung an eine lokale Variable, nicht als Methodenaufruf. Nimm stattdessen self.setter= für den Methoden-Aufruf.
end hin.
Object#type überprüfen.
{} statt do/end benutzt.
$stdout als auch $stderr schreibst, kann der Output in einer anderen Reihenfolge auftauchen, als du erwartest. Benutze immer ungepuffertes I/O (setze sync=true) für Debug-Meldungen.
String und er wird nicht automatisch in eine Zahl konvertiert. Ein Aufrufg von to_i wirkt da Wunder. Ein üblicher Fehler von Perl-Programmierern ist
while gets num1, num2 = split /,/ # ... end |
Hash#rehash-Aufruf, falls es das doch macht).
trace_var, um Änderungen an Variablen zu überwachen.
Object#freeze. Wenn du argwöhnst, dass irgendeine nicht so genau bekannte Stelle im Code deine Variable verändert, versuch die Variable einzufrieren. Der Bösewicht wird dann erwischt, wenn er versucht, deine Variable zu ändern.
x- und y-Variablen erzeugen, in der zweiten Variante muss es das nicht. Wir benutzen das
benchmark-Paket aus dem Ruby-Applikations-Archiv, um die Schleifen zu vergleichen:
require "benchmark"
include Benchmark
n = 1000000
bm(12) do |test|
test.report("normal:") do
n.times do |x|
y = x + 1
end
end
test.report("predefine:") do
x = y = 0
n.times do |x|
y = x + 1
end
end
end
|
user system total real normal: 2.510000 0.000000 2.510000 ( 2.390549) predefine: 2.220000 0.010000 2.230000 ( 2.157877) |
-r profile zu seinem Code hinzufügen oder von innerhalb mit require
"profile". Ein Beispiel:
require "profile" class Peter def initialize(amt) @value = amt end def rob(amt) @value -= amt amt end end class Paul def initialize @value = 0 end def pay(amt) @value += amt amt end end peter = Peter.new(1000) paul = Paul.new 1000.times do paul.pay(peter.rob(10)) end |
time seconds seconds calls ms/call ms/call name 40.22 0.37 0.37 1 370.00 920.00 Fixnum#times 25.00 0.60 0.23 1000 0.23 0.25 Paul#pay 25.00 0.83 0.23 1000 0.23 0.30 Peter#rob 7.61 0.90 0.07 1000 0.07 0.07 Fixnum#- 2.17 0.92 0.02 1000 0.02 0.02 Fixnum#+ 0.00 0.92 0.00 1 0.00 0.00 Peter#initialize 0.00 0.92 0.00 2 0.00 0.00 Class#inherited 0.00 0.92 0.00 1 0.00 0.00 Paul#initialize 0.00 0.92 0.00 4 0.00 0.00 Module#method_added 0.00 0.92 0.00 2 0.00 0.00 Class#new 0.00 0.92 0.00 1 0.00 920.00 #toplevel |
Debugger-Kommandos
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||