2014-03-02 83 views
1

當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 

回答

3

塊在Ruby中引入一個新的詞彙範圍。

因此,在塊內聲明的變量是塊的局部範圍,不能在其外部訪問。

因此number變量只存在於塊3.times do ... end內。

至於何時你的代碼執行會發生什麼:

當執行到達線"#{person} got a #{number}"紅寶石會看到number不存在作爲一個局部變量,然後將嘗試調用該名稱的方法。它不會找到方法,那麼它將執行您定義的method_missing

因此,你有一種遞歸函數會無限期地調用它自己,所以它會導致一個SystemStackError異常。