2012-03-27 9 views
4

私は次のコードを使用して、ターミナルの引数としてファイルを受け取り、読み取ってその内容でbody変数を更新しようとしています。ファイルが渡されていない場合は、ユーザーが自分の本文を入力できるようにするプロンプトが表示されます。私は、ファイルに渡さずにプログラムを実行するとRubyスクリプトへのコマンドライン引数の受け入れ


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 

私はこれが返され得る:


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 `' 

私は、Rubyことが、むしろ新たなんだので、それを最高ではありませんよ。私は、多くのものを交換して物事を変えようとしましたが、無駄にしました。私は間違って何をしていますか?

答えて

10

defined?(ARGV)は、ブール値falseではなく、"constant"を返します。それはfalseと評価されないので、filenameARGV[0]と定義され、これはnilです。

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

From the docs:

定義:

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

は、代わりにあなたはARGVの長さを確認するのでしょうか? expressionは、式が認識可能なもの(リテラルオブジェクト、初期化されたローカル変数、現在のスコープから見えるメソッド名など)を参照するかどうかをテストします。式を解決できない場合、戻り値はnilです。そうでない場合、戻り値は式に関する情報を提供します。

2

マイケルはあなたの質問に基本的な答えをくれました。 Rubyのやや多少のやり方は、ARGFを使って読むことです。あなたは、あなたがファイルの内容を格納スキップすることができ、本体と何かする必要がない場合は(、..ofもちろん

puts "Post title: " 
title = gets.chomp 

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

:条件付きでのみプロンプトを印刷するかどうかを決定するために必要とされますs)だけで

puts ARGF.gets.chomp 
関連する問題