1

Zed Shaw の Learn Ruby the Hard Way 演習 15 からこのコードを実行しようとしています。

filename = ARGV.first

prompt = '> '
txt = File.open(filename)

puts "Here's your file: #{filename}"
puts txt.read()

puts "I'll also ask you to type it again:"
print prompt
file_again = STDIN.gets.chomp()

txt_again = File.open(file_again)

puts txt_again.read()

実行するたびに、次のようなエラー メッセージが表示されます。

ex15.rb:4:in `initialize': can't convert nil into String (TypeError)
from ex15.rb:4:in `open'
from ex15.rb:4

何が起こっている?このコードを動作させることができません!

4

4 に答える 4

0

どのようにスクリプトを実行しましたか? スクリプトは次のような引数を期待しているようです: ruby my_script.rb file.txt.

この議論を提供しましたか?そうでない場合はARGV[0]戻りnil、スクリプトは次のように評価されるため、4 行目で失敗します。

txt = File.open(nil)

File.openは、ファイル名/ファイルへのパスを想定しています。ファイル、Ruby 2.0 Docsを参照してください。

于 2013-08-02T07:54:49.487 に答える
0

エラーメッセージを見てください:

Line 4: File.open waits for a String as an argument, and gets instead a Nil reference.

つまりARGV.first、スクリプト名の後のコマンドラインからの最初の引数である は未定義です。

于 2013-08-02T07:55:03.550 に答える
0

この質問が少し古いことは知っていますが、その答えは、以前の自分と同じように、この同じ問題について助けを探している他の人に役立つかもしれないと思います.

同じ問題がありましたが、これを機能させるために私がしたことです。

私のコード:

filename = ARGV.first
txt = open(filename)

puts "Here's your file #{filename}"
print txt.read

print "Type the filename again: "
file_again = $stdin.gets.chomp

txt_again = open(file_again)

print txt_again.read

それが正しいコードです。しかし、ファイルを機能させてそのエラーを回避するための秘訣は、ex15.rb ファイルのコードにはありません。これは、プレーン テキストの ex15_sample.txt ファイルを作成する場所と方法に関係しています。

TextWrangler を使用している場合、または私の場合は TextMate のように使用している場合は、別のタブまたはウィンドウと別のファイルを作成します。必ずプレーンテキストを選択してください:

ここに画像の説明を入力

次に、指定されたテキストをファイル内に書き込みます。

これは私がファイルに入力したものです。それは本当にクールなものです。ここにはたくさんの楽しみがあります。

次に、ex15.rb スクリプトと同じディレクトリに保存します。

次に、ターミナルに移動します。次のように入力します (使用しているディレクトリ名とパスは私の例ではありません。正しい情報を使用して入力する必要があります)。

ruby /users/ily​​afeynberg/desktop/rubyway/ex15.rb ex15_sample.txt

すべての手順を正しく実行すると、正しく実行され、ターミナルから適切にプロンプ​​トが表示されます。ex15.rb ファイルへの適切なパスを指定する必要があることに注意してください。私が作成したディレクターを省略して「rubyway」に入れていたら、失敗していたでしょう。

注:正直なところ理由はわかりませんが、Mac の TextEdit でプレーン テキスト機能を使用してプレーン テキスト ファイルを作成すると、大量の問題が発生し、機能しませんでした。エディター内でプレーン テキスト ファイルとして作成し、適切に保存することで違いが生まれ、何が間違っていて、何を正しく行う必要があるかを理解できるようになりました。したがって、TextEdit を使用するのではなく、スクリプトを作成するエディターを使用することをお勧めします。

幸運を!

于 2014-07-20T17:40:21.710 に答える
0

ここに:

filename = ARGV.first
# ...
txt = File.open(filename)

あなたは を仮定しているfilenameので、ARGV.first常に存在します。これは、特に入力を処理する場合に絶対に行うべきではない仮定です。

何も指定されていない場合に備えて、デフォルト値を指定することをお勧めしますfilename

filename = (ARGV.count > 0) ?  ARGV.first : "default.txt"

または、独自の例外をスローして、上位レベルの抽象化で処理させます。

raise RuntimeError.new "No input file" unless ARGV.count > 0
于 2013-08-02T12:29:15.370 に答える