2015-03-25 43 views
1

我寫了一個簡單的回聲循環,但它給出了未定義的局部變量錯誤。當它設置在同一行時,局部變量undefined

> puts line while line = gets 
NameError: undefined local variable or method `line' for main:Object 

爲什麼lineputs不可見?

我知道加入line = nil可以解決這個錯誤。但我想知道爲什麼如此。

> line = nil 
> puts line while line = gets #==> Works! 
apple banana 
apple banana 
+0

我不明白爲什麼這個問題最初是downvoted?我發現它很有用。 – shivam 2015-03-25 07:08:32

+1

請參閱[修飾符'if'和'unless'](http://ruby-doc.org/core-2.2.1/doc/syntax/control_expressions_rdoc.html#label-Modifier+if+and+unless)(第三個示例) – Stefan 2015-03-25 07:58:46

+0

@Stefan謝謝。我現在知道了。 – 2015-03-25 08:54:38

回答

4

您會遇到一個錯誤,因爲Ruby解析器從上到下,從左到右讀取,所以它讀取的內容爲puts line,但不知道有關此變量的任何信息。

while line = gets 
    puts line 
end 

這樣解析器將首先看到的分配,不會抱怨:如果你重寫它這樣

您的代碼將工作。

+1

是的,它是[reason](https://bugs.ruby-lang.org/issues/1141)+1 – 2015-03-25 06:57:16

0

當您給puts "hello"時,您向口譯員提供有關打印內容的信息。

當你給puts line,解釋器會尋找一個對象line。否則你會得到錯誤:NameError: undefined local variable or method 'line' for main:Object。這是宣言的力量!學習閱讀錯誤消息。祝一切順利!