使用class_eval ruby​​时堆栈级别太深(SystemStackError)

时间:2011-11-13 16:37:53

标签: ruby

当我运行这个程序时,不明白为什么我的堆栈级别太深了。

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

2 个答案:

答案 0 :(得分:8)

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

让我们看一下fruit = :apple扩展到的内容:

def apple
    puts apple
end

现在应该清楚为什么会导致无限递归。

答案 1 :(得分:4)

将此行从puts #{fruit}更改为puts '#{fruit}'。因为这段代码位于类eval中,所以ruby认为此行是调用方法,并尝试一次又一次地调用#{fruit}(appleorange)方法。