在块中定义的变量

时间:2014-03-02 13:14:21

标签: ruby

当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

1 个答案:

答案 0 :(得分:3)

Ruby中的块引入了一个新的词法范围。

因此,块内声明的变量是块的作用域的本地变量,不能在其外部访问。

因此number变量仅存在于块3.times do ... end内。

关于代码执行时会发生什么:

当执行到达行"#{person} got a #{number}"时,Ruby将看到number不存在作为局部变量,然后将尝试使用该名称调用方法。它既不会找到方法,也会执行您定义的method_missing

因此,你有一种递归函数会无限期地调用它自己,因此会导致SystemStackError异常。