2

クラスでメソッドを使用することは可能openですか? メソッドが?Parserと競合しているようです。IO::open

class Parser
    require 'nokogiri'

    def parse
        doc = open "someFile.html"
        # Get to parsin' ...
    end 

    def open str
        Nokogiri::HTML(open(str))
    end 
end 

parser = Parser.new
parser.parse

スクリプトを実行すると、次のエラーが表示されます。

$ ruby parser.rb
parser.rb:10: stack level too deep (SystemStackError)

私はさまざまなことを試しましたが、うまくいくように見える唯一のことは、名前Parser::openを 以外のものに変更することopenですdocopen

ルビーの仕組みを理解しようとしているので、答え以外の説明があれば大歓迎です!

4

3 に答える 3

2

何が起こっているように見えるかというと、

def open str
  Nokogiri::HTML(open(str))
end

SystemStackErrorスタックレベルを深くしすぎる原因となる再帰ループにあります。

open(str) で正確に何をしようとしていますか? を に変更したときopendocopen正確にはどこを変更しましたか?

于 2013-01-28T20:57:22.443 に答える
2

stack level too deep (SystemStackError)メソッドが再帰的に呼び出されているため、エラーが発生しています。

def open str
  Nokogiri::HTML(open(str)) # here you call this same method over and over again
end

これは、定義したメソッドがコンテキストでより近いため、呼び出されるように選択されたために発生します。

理解したとおりにメソッドの名前を変更するか、このようなことを行って、使用したいオープンメソッドが定義されている1つのレシーバーで明示的に呼び出すことができます

def open str
  uri = URI.parse(str)
  Nokogiri::HTML(uri.open)
end
于 2013-01-28T20:57:46.960 に答える
2

openObjectすべての Ruby クラスの親クラスに含まれるモジュール Kernel のメソッドです。何が起こるかというopen(str)

class Parser

  def open str
    Nokogiri::HTML(open(str))
  end

openパーサーで定義したメソッドを再帰的に呼び出しています。メソッドを次のように変更した場合

  def open str
    Nokogiri::HTML(Kernel.open(str))
  end

open意図したとおりにカーネルでメソッドを呼び出します。

于 2013-01-28T21:18:32.727 に答える