当Ruby执行第puts "#{number}..."
行时,
为什么它不知道那个数字应该是一个变量呢?
它试图执行self.number方法
class Roulette
def method_missing(name, *args)
person = name.to_s.capitalize
3.times do
number = rand(10) + 1
puts "#{number}..."
end
"#{person} got a #{number}"
end
end
number_of = Roulette.new
puts number_of.bob
答案 0 :(得分:3)
Ruby中的块引入了一个新的词法范围。
因此,块内声明的变量是块的作用域的本地变量,不能在其外部访问。
因此number
变量仅存在于块3.times do ... end
内。
关于代码执行时会发生什么:
当执行到达行"#{person} got a #{number}"
时,Ruby将看到number
不存在作为局部变量,然后将尝试使用该名称调用方法。它既不会找到方法,也会执行您定义的method_missing
。
因此,你有一种递归函数会无限期地调用它自己,因此会导致SystemStackError
异常。