REPL
REPL
in der Welt der kniehohen Entwicklung steht für Read → Evaluate → Print Loop . Gelesen, ausgeführt, gedruckt und so oft.
Ruby wird, wie viele andere Sprachen auch, mit einer eigenen REPL- Implementierung namens irb
. Was, obwohl es primitive Aufgaben bewältigt, die Anforderungen des anspruchsvollen Entwicklers noch nicht voll erfüllen kann. Aber es gibt eine viel weiterentwickelte Alternative: pry
.

Hier ist ein Auszug aus der offiziellen pry
Website:
Pry ist eine leistungsstarke Alternative zum Standard-Ruby-IRB-Wrapper. Mit Syntax-Hervorhebung , flexibler Plugin-Architektur , Laufzeitaufrufen sowie Anzeige von Quelle und Dokumentation .
Und das ist nicht nur bla bla bla Werbung. Es stimmt. Ich werde zeigen, wie man pry
installiert und konfiguriert, um den anspruchsvollsten Entwickler zufrieden zu stellen. Es wird davon ausgegangen, dass die aktuelle Arbeitsversion von Ruby auf dem Zielcomputer installiert ist und ausgeführt wird.
Vorbereitung
Gehen Sie zur Konsole und führen Sie den Befehl aus:
$ gem install pry pry-theme awesome_print coderay
Alles, wir sind komplett fertig. Lass uns pry
... und sicherstellen, dass es keinen Unterschied zu irb
. Plötzlich nicht mehr sehr nett.
Dann lass uns pry
ein bisschen schlauer zu sein.
Konfigurationsdatei
Das ist .pryrc
. Es gibt bereits eine Konfigurationsdatei im Home-Verzeichnis, die pry
darüber gibt, wie man in einer anständigen Gesellschaft aussieht und wie man sich verhält. Wenn nicht, können Sie es mit dem cd && touch .pryrc
.
.pryrc
Anweisungen zum Befüllen
Ich werde die verschiedenen Funktionen von pry
Schritt für Schritt demonstrieren. Für die Ungeduldigen: gist .pryrc
.
pry
: Hier finden Sie jede Menge nützliche Informationen für erfahrene Stemmeisen.- Themen
pry
: Fragen, Antworten usw.
Standardeditor
Pry.editor = 'vi'
Konfiguriert den Editor, der zum Bearbeiten des aktuellen Kontexts verwendet wird ( edit
).
Eingabeaufforderung
Pry.config.prompt = [ ->(_obj, _nest_level, _) { "✎ " }, ->(*) { " " } ]
.pryrc
ist nur eine .pryrc
Datei, daher kann dieser Prozess jeden gewünschten Code ausführen oder sogar Bitcoins abbauen, während Sie auf die nächste Eingabeaufforderung warten.
Die erste Ebene und die verschachtelten Ebenen (innerhalb von Blöcken) können auf verschiedene Arten gezeichnet werden. Früher habe ich ein schwarz schattiertes Dreieck verwendet, das einen dummen Parser für die erste Ebene und ▷ für verschachtelte Parser ausschneidet. Nach und nach kam ich zu dem Schluss, dass das Fehlen von zusätzlichen Zeichen im Snippet das Kopieren des Fragments erheblich erleichtert. Deshalb so.
Farben
Um Themen zu unterstützen, wird pry-theme
Gem verwendet. Ich benutze Syntax- PRY_BW=true pry
(und wenn ich gelangweilt bin, PRY_BW=true pry
ich PRY_BW=true pry
). Bei Ordnern, in denen Rails ausgeführt wird (mit Rails- Projekten), sind die Farben möglicherweise noch ausgefallener, aber ich hasse Rails . Was dort passiert, kann ich nicht mit Sicherheit sagen.
unless ENV['PRY_BW'] Pry.color = true Pry.config.theme = "railscasts" Pry.config.prompt = PryRails::RAILS_PROMPT if defined?(PryRails::RAILS_PROMPT) Pry.config.prompt ||= Pry.prompt end
Die Geschichte
Dies ist nur eine Entdeckung. Drücken Sie im Debug-Modus oder wenn der Befehl unmittelbar zuvor ausgeführt wurde, einfach ⏎, und der Befehl wird wiederholt. Dies ist äußerst nützlich, wenn Sie zum Code im Debugger wechseln möchten (wenn Sie den Debugger natürlich überhaupt verwenden und nicht alle Fehler mit einem festen Aussehen beheben, den Debugger beispielsweise niemals wie mich starten).
Pry.config.history.should_save = true Pry::Commands.command /^$/, "repeat last command" do _pry_.run_command Pry.history.to_a.last end
Mannschaften
Debugger Das Fahrrad gehört nicht mir, ich habe diese fünf Zeilen nur von meinem Teamkollegen ausgeliehen, der sein ganzes Leben mit dem Debuggen verbringt, aber es funktioniert.
Pry.commands.alias_command 'c', 'continue' rescue nil Pry.commands.alias_command 's', 'step' rescue nil Pry.commands.alias_command 'n', 'next' rescue nil Pry.commands.alias_command 'f', 'finish' rescue nil Pry.commands.alias_command 'l', 'whereami' rescue nil
Modul / Klasse Beschreibung Konfiguration
Pry.config.ls.separator = "\n"
Es gibt anscheinend nichts zu kommentieren.
Rufen Sie System Utilities auf
Pry
unterstützt das Aufrufen von Systemdienstprogrammen (fügen Sie einfach einen Punkt vor dem Befehlsnamen ohne Leerzeichen, .ls
oder .ps axu
).
Plugins
Nachfolgend finden Sie das einfachste Beispiel für die Plugin-Konfiguration. Niemand mag aufgeblähte Konfigurationen, wir polieren sie und tragen sie jahrzehntelang mit verschiedenen Maschinen herum. Das folgende Snippet ist nur ein Beispiel (für das awesome
Plugin). Die Kommentare im Code sprechen für sich.
Kundenspezifische Teams
Habe ich schon erwähnt, dass pry
sehr coole REPL ist? Wir können sogar einen eigenen pry
definieren, der innerhalb von pry
. Das folgende Beispiel zeigt, wie Sie einen sql
Befehl erstellen, um reines SQL über die Konsole auszuführen (vorausgesetzt, wir haben eine funktionierende AR-Verbindung) - mit einer minimalen Anzahl von Tastenanschlägen.
default_command_set = Pry::CommandSet.new do command "sql", "Send sql over AR." do |query| if ENV['RAILS_ENV'] || defined?(Rails) pp ActiveRecord::Base.connection.select_all(query) else pp "No rails env defined" end end end Pry.config.commands.import default_command_set
Monkeypatches und Globals
Ja, wir können jeden Ruby-Code mit unseren eigenen Monkeypatches anpassen und ausführen, die nur in pry
Sitzungen verfügbar sind. Ich finde diesen Code beispielsweise sehr praktisch, um Code zu testen, der mit Arrays und Hashes arbeitet.
class Array def self.sample(count = 10, &block) Array.new(count, &(block || :succ)) end end Hash.singleton_class.prepend(Module.new def sample(count = 10) (?a...count.times.reduce(?a) { |o| o.succ }). map(&:to_sym).zip(0...count).to_h end end)
Hinweis: Wenn Sie der Meinung sind, dass das obige Snippet durch diese Integer#succ
überkompliziert ist, haben Sie wahrscheinlich noch nie lange Hashes mit mehr als 26 Schlüsseln ausgeführt :)
Farbeinstellung
Alles, was unten steht, dient zum Anpassen der Farben mit coderay
gem. Das Ergebnis ist es wert. Die Symbole sind rot und die Zahlen sind blau und der ganze Jazz.
CodeRay.scan("example", :ruby).term
Abschließend
Ich hoffe, dieser Beitrag gibt einen ersten Eindruck davon, was pry
ist und warum es besser ist als irb
. Ich habe mich nicht besonders auf den Debugging-Prozess konzentriert, hauptsächlich, weil ich nicht debugge, sondern den richtigen Code von Grund auf neu schreibe. Aber ich hoffe, dass mich diejenigen interessieren könnten, die diese Buchstabenkombination zum ersten Mal sehen - versuchen Sie es zumindest. Glaub mir, es lohnt sich.
Gute Nachbauten!