2014-09-11 60 views
0

我發現很難理解如何將以下變量設置爲nil,而它似乎並未分配到任何位置。爲什麼變量在「if false」中出現時聲明?

我試過這個在ruby 2.1.2ruby 1.8.7。兩者都產生相同的結果。

這是怎麼發生的?

irb(main):002:0> foo 
    NameError: undefined local variable or method `foo' for main:Object 

irb(main):003:0> if false 
    irb(main):004:1> foo = 1 
irb(main):005:1> end 

irb(main):006:0> foo 
=> nil 
+0

(該變量*不*「分配」的值,但它是作爲局部變量引入的 - nil僅僅是默認值,因爲變量必須計算爲* a *值。) – user2864740 2014-09-11 09:13:08

回答

0

Ruby在解析器級別處理分配。從documentation

當分析器遇到的 分配創建的本地變量,當分配發生不:

a = 0 if false # does not assign to a 

p local_variables # prints [:a] 

p a # prints nil 
+1

「解析器遇到賦值」有點含糊;考慮'def x(t);如果t返回y; y =「你好世界」;結束; x(真)'拋出一個NameError。然而解析器在「x」被調用之前「遇到」了整個方法體。 – user2864740 2014-09-11 09:20:09

相關問題