2012-04-19 10 views
0

私の研究は、ここに無限再帰を引き起こすものがあることを示しているようですが、わかりません。誰かが間違っていることを指摘できますか?スタックレベルが深すぎますが、正確に何が無限再帰を引き起こしているのかわかりません

def initialize(_val) 
    @start_value = _val 
end 

def method_missing(method, *args) 
    if method.starts_with?("plus") then 
     num = method[4 .. method.length] 
     if (/^[\d]+(\.[\d]+){0,1}$/ === num) then 
      number = Integer(num) 
      self.class_eval("def #{method}; return @start_value + x; end") 
     self.plus(number) 
     else 
      super.method_missing 
     end 
    else 
     super.method_missing 
    end 
end 

end 
+0

これは奇妙です。私はあなたのコードがSymbolに 'starts_with? 'を呼び出すためのNoMethodErrorをすぐにスローすることを期待しています。また、あなたは 'super'を間違って使用しています - それは単に' super'でなければなりません。 '.method_missing'を追加することによって、スーパークラスの' method_missing'を呼び出した結果に対して 'method_missing'を呼び出しています。 – sepp2k

答えて

1

あなたがこれを行うべきではありません。呼び出すための適切な方法をであるあなたが引数なしでsuperを使用していると思いますいずれの場合も、

super 

、:

super.method_missing 

をあなたはこれが欲しいです祖先のメソッドのバージョン(この場合はmethod_missing)。しかし、あなたのバージョンでは、method_missingを重複して結果に呼び出しています。これはすべて無限になります。

1

もっとも明白な説明は、plusがインスタンスメソッドとして定義されていない場合です。しかし、あなたのmethod_missingメソッドの先頭にputs methodを追加して、何が起こっているのかを確認するのはなぜですか?

関連する問題