2011-11-13 2 views
2

なぜこのプログラムを実行するとスタックレベルが高すぎるのか理解できません。class_evalルビーを使用中にスタックレベルが深すぎる(SystemStackError)

module A 
    class Fruit 

    def initialize 
     puts "pears" 
    end 

    [:orange, :apple].each do |fruit| 
     class_eval %Q{ 
      def #{fruit} 
       puts #{fruit} 
      end 
     } 
    end 

    puts "pineapple" 
end 

a_fruit = Fruit.new 
a_fruit.apple 
end 

another_fruit = A::Fruit.new 
another_fruit.orange 

このプログラムの出力は

(eval):3:in `apple': stack level too deep (SystemStackError) 
    from (eval):3:in `apple' 
    from testquestion.rb:20 

答えて

4

変更puts #{fruit}からputs '#{fruit}'にこのラインです。このコードはクラスevalの中にあるので、rubyはこの行をメソッド呼び出しとみなし、#{fruit}(appleまたはorange)メソッドを繰り返し呼び出すようにします。

8
class_eval %Q{ 
    def #{fruit} 
     puts #{fruit} 
    end 
} 

のは、これがfruit = :appleのために展開するものを見てみましょう:

def apple 
    puts apple 
end 

それは無限再帰を引き起こし、なぜそれが今、明確にする必要があります。

関連する問題