1

私はいくつかのコードを書きました:

output = File.open(text_file).collect.reverse.join("<BR>")

1.8.7では問題なく動作するようですが、エラーが発生します

NoMethodError - undefined method 'reverse' for #<Enumerator: #<File:C:\EduTester\cron\rufus.log>:collect>:

1.9.1(ruby 1.9.3p194(2012-04-20)[i386-mingw32])

誰かがこれが起こる理由とこれを修正する方法を知っていますか?(なぜ私が最も興味を持っているのですか。)

4

4 に答える 4

5

最初にそれを修正する方法-あなたはこれを行うべきです:

output = File.open(text_file).to_a.reverse.join("<BR>") 

これは、Rubyのどちらのバージョンでも機能します。.to_a基本的に、ファイルを逆にして改行を追加する前に、ファイルを行の配列(と)に変換する必要があります。

理由に関して(これは少し技術的になります):モジュールFile内で混合し、のようなメソッドを提供します。現在、Ruby 1.87では、ブロックなしで呼び出すと、が返されます。しかし、1.9では、メソッドに応答しない-を返します。EnumerablecollectEnumberable.collectArrayEnumeratorreverse

問題のメソッドの2つのバージョンは次のとおりです。

http://ruby-doc.org/core-1.8.7/Enumerable.html#method-i-collect
http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-collect

つまり、基本的に1.9より前.collectは(ハッキー)と同等でした.to_a。ただし、常に.to_a何かを配列に変換するために使用します。

于 2012-10-10T05:15:34.867 に答える
4

Ruby 1.8.7では、collectメソッドでブロックが指定されているかどうかに関係なく、配列を返します。ただし、1.9では、ブロックがcollectメソッドで指定されている場合にのみ配列を返します。それ以外の場合は、列挙子オブジェクトを返します。ドキュメントから-

収集方法-

列挙型の要素ごとに1回ブロックを実行した結果を含む新しい配列を返します。ブロックが指定されていない場合は、代わりに列挙子が返されます。

于 2012-10-10T05:21:55.893 に答える
2

1.8.7では、collectメソッドはFileオブジェクトに適用されると配列を返しますが、1.9.3では、列挙子を返します。の方法は、アレイにのみ適用できます。

于 2012-10-10T05:16:08.043 に答える
0

これが1.8.7で機能する理由は、Enumerable#collect1.8.7でブロックなしで呼び出すと、引数を返すだけのデフォルトブロックを使用するため、ファイル内の行の配列を返すのfile.collectと同じです。 Array#reverse`file.collect {|x| x}を呼び出すことができます。

1.9.xではEnumerable#collect、ブロックなしで呼び出すと。が返されますEnumerator。列挙子はネイティブにサポートしておらず#reverse、そのミックスインもサポートしていませんEnumerable。したがって、NoMethodErrorが発生します。

どちらのバージョンとも互換性のある方法でこの式を記述したい場合は、の#to_a代わりにを使用して#collectください。

output = File.open(text_file).to_a.reverse.join("<BR>")

于 2012-10-10T05:33:05.280 に答える