当我运行这个程序时,不明白为什么我的堆栈级别太深了。
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
答案 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}(apple
或orange
)方法。