2016-09-21 4 views
1

Ich schreibe ein Skript mit verschiedenen Optionen in Ruby, und ich kann nicht verstehen, wie der OptionParser mir helfen könnte.Ruby Beispiel mit Ausrufezeichen

Insbesondere gibt es ein Beispiel in der Dokumentation: https://docs.ruby-lang.org/en/2.1.0/OptionParser.html

require 'optparse' 

options = {} 
OptionParser.new do |opts| 
    opts.banner = "Usage: example.rb [options]" 

    opts.on("-v", "--[no-]verbose", "Run verbosely") do |v| 
    options[:verbose] = v 
    end 
end.parse! 

p options 
p ARGV 

Ich kann das Ausrufezeichen auf der „end.parse“ Linie verstehen (aber ich erwartete einen Parameter danach), aber ich finde Die folgenden 2 Zeilen verwirrend, wurde nicht deklariert, und ich kann nicht verstehen, ob es Teil der Beispielquelle ist.

Und wie verwende ich die '-v' Option? Prüfe ich einfach, ob die Optionen [: v] nil oder true sind?

Letzte Sache, was passiert mit den anderen Optionen? Kopiert der OptionParser nur Switches? Was wäre, wenn ich nach dem '-v' noch andere Parameter hätte? Wie myscript -v duck ketchup banana?

+0

'p' ist [definiert in' Kernel'] (http://ruby-doc.org/core-2.3.1/Kernel.html#method-ip), daher ist es (fast) immer in Ruby verfügbar . 'p obj' ist äquivalent zu' puts obj.inspect'. – GolfWolf

Antwort

3

Ihre Fragen zu beantworten:

ich das Ausrufezeichen auf der „end.parse“ Linie verstehen kann (aber ich einen Parameter danach erwartet)

The documentation besagt, dass parse! ein nimmt optional argv Parameter. Wenn es nicht angegeben wird, ist es standardmäßig default_argv, was ich mir vorstelle, ist die Zeichenfolge, die die Argumente enthält, die an dieses Skript in der Befehlszeile übergeben werden.

p wird nicht erklärt, und ich kann nicht verstehen, wenn es Teil der Beispielquelle

pdefined in Kernel ist ist, so ist es (fast) immer in Ruby zur Verfügung. p obj entspricht puts obj.inspect.

In diesem Zusammenhang wird p nur verwendet, um zu illustrieren, dass nach dem Analysieren der Argumente der options-Hash alle Flags/Optionen enthält, die Sie im OptionParser-Block definiert haben.

Und wie verwende ich die '-v' Option? Prüfe ich einfach, ob die Optionen [: v] gleich Null oder wahr sind?

Ja, aber das wäre eigentlich options[:verbose].

Letzte Sache, was passiert mit den anderen Optionen? Kopiert der OptionParser nur Switches? Was wäre, wenn ich nach dem '-v' noch andere Parameter hätte? Wie myscript -v duck ketchup banana?

Sie werden mehrere Anrufe zu opts.on machen müssen alle anderen Schalter/Argumente interessiert Sie sind übereinstimmen. Schauen Sie sich die Dokumentation here für Erklärungen, wie das zu tun.

+1

Um genau zu sein, ist 'p' in Instanzen aller Klassen verfügbar, explizit einschließlich' Kernel' und/oder abgeleitet von 'Object', einschließlich' main'. Es ist _nicht definiert_ in Instanzen von Klassen, abgeleitet direkt von 'BasicObject' und nicht einschließlich' Kernel' (normalerweise passiert dies bei DSL.) BTW, upvoted für großartige Formatierung. – mudasobwa