2012-03-27 6 views
4

Ich versuche, den folgenden Code zu verwenden, um in einer Datei als Argument im Terminal zu akzeptieren, die dann gelesen und die body Variable mit ihrem Inhalt aktualisiert wird. Wenn die Datei nicht übergeben wird, möchte ich die Eingabeaufforderung haben, wo der Benutzer seine eigene Textkopie eingeben kann.Akzeptieren von Befehlsargumenten in ein Ruby-Skript


require 'posterous' 

Posterous.config = { 
    'username' => 'name', 
    'password' => 'pass', 
    'api_token' => 'token' 
} 

include Posterous 
@site = Site.primary 

#GETS POST TITLE 
puts "Post title: " 
title = STDIN.gets.chomp() 

if defined?(ARGV) 
    filename = ARGV.first 
end 

if (defined?(filename)) 
    body = File.open(filename) 
    body = body.read() 
else 
    puts "Post body: " 
    body = STDIN.gets.chomp() 
end 
puts body 

Wenn ich das Programm ohne den Weg in eine Datei laufen bekomme ich diese zurückgegeben:


Post title: 
Hello 
posterous.rb:21:in `initialize': can't convert nil into String (TypeError) 
    from posterous.rb:21:in `open' 
    from posterous.rb:21:in `' 

Ich bin ziemlich neu in Ruby und damit bin nicht der Beste darin. Ich habe versucht, viele Dinge zu tauschen und Dinge zu ändern, aber ohne Erfolg. Was mache ich falsch?

Antwort

10

defined?(ARGV) wird keine boolesche false, sondern "constant" zurückgegeben. Da dies nicht zu false ausgewertet wird, wird filename als ARGV[0] definiert, die nil ist.

>> ARGV 
=> [] 
>> defined?(ARGV) 
=> "constant" 
?> ARGV.first 
=> nil 

Stattdessen könnten Sie die Länge der ARGV überprüfen:

if ARGV.length > 0 
    filename = ARGV.first.chomp 
end 

From the docs:

definiert? Ausdruck testet, ob Ausdruck auf etwas erkennbares verweist (Literalobjekt, lokale Variable, die initialisiert wurde, Methodenname, der aus dem aktuellen Bereich sichtbar ist, usw.). Der Rückgabewert ist Null, wenn der Ausdruck nicht aufgelöst werden kann. Andernfalls liefert der Rückgabewert Informationen über den Ausdruck.

2

Michael gab Ihnen die grundlegende Antwort auf Ihre Frage. Ein etwas mehr rubitischer Weg wäre, ARGF zu benutzen, um das Lesen zu machen; dann wird die bedingte benötigt nur, ob oder nicht, zu entscheiden, um die Abfrage zu drucken:

puts "Post title: " 
title = gets.chomp 

puts "Post body: " if ARGV.length == 0 
body = ARGF.gets.chomp 
puts body 

..natürlich, wenn Sie mit dem Körper auf etwas anderes brauchen nicht, können Sie die Inhalte der Datei überspringen Speichern (s) und tun Sie einfach

puts ARGF.gets.chomp 
Verwandte Themen