0

このばかげた質問で申し訳ありませんが、私はルビーが初めてです。このエラーで終わる以下のコードのどこが間違っていますか:

private method `gets' called for "file.txt":String (NoMethodError)

コードは次のとおりです。

def read_file(path)
 File.open(path, 'r') do |file|
    while line = path.gets
     puts line
    end 
 end 
end

def initialize
  read_file("file.txt")
end
4

2 に答える 2

2

あなたはこう言っています:

path.gets

pathあり、Stringです。getsにメソッドKernelがあります:

gets(sep=$/) → 文字列
gets(limit) → 文字列または nil
gets(sep,limit) → 文字列または nil

(または)$_のファイルのリストから、またはコマンド ラインにファイルが存在しない場合は標準入力から次の行を返します (および に割り当てます)。ARGV$*

StringにはKernelviaが含まれてObjectいるため、gets上記のメソッドは のインスタンス メソッドでもありますString。しかし、Kernel#getsプライベートなのでString#getsプライベートであり、エラーがあります:

private method `gets' called for "file.txt":String (NoMethodError)

gets他の場所で述べたように、あなたは電話をかけたいと思ってfileいます。

Kernel#getsは、多くの (すべての?)メソッドと同様に、素早いワンライナーなどの単純な関数のようにKernel扱うことができるようになっています。getsのワンライナー性Kernel#getsは、 に対して処理を行う理由でもあり$_ます。


この回答は主に背景情報であるため、何が起こっているのかがわかります。彼らは正しく、最初に参加したので、Hckの答えを受け入れることをお勧めします。

于 2012-11-09T08:29:57.433 に答える
2

while line = path.getsと置き換えますwhile line = file.gets

于 2012-11-09T07:49:53.043 に答える