2015-03-25 2 views
1

Я написал простой цикл эха, но он дает неопределенную ошибку локальной переменной.Локальная переменная неопределенная, когда она задана в той же строке

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

Почему line не видна puts?

Я знаю, что добавление line = nil исправляет эту ошибку. Но я хочу знать, почему так.

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

Я не понимаю, почему этот вопрос был изначально занижен? Я нашел это довольно информативным. – shivam

+1

См. [Модификатор 'if' и' except'] (http://ruby-doc.org/core-2.2.1/doc/syntax/control_expressions_rdoc.html#label-Modifier+if+and+unless) (третий пример) – Stefan

+0

@Stefan Спасибо. Теперь я понимаю. –

ответ

4

Вы сталкиваетесь с ошибкой, потому что анализатор Ruby читает сверху вниз, слева направо, поэтому он читает puts line, но ничего не знает об этой переменной.

Ваш код будет работать, если вы переписать так:

while line = gets 
    puts line 
end 

В этом пути парсер будет видеть назначение первым и не будет жаловаться.

+1

Да, это [причина] (https://bugs.ruby-lang.org/issues/1141) +1 –

0

Когда вы даете puts "hello", вы даете информацию переводчика о том, что печать.

Когда вы дадите puts line, переводчик будет искать объект line. В противном случае вы получите сообщение об ошибке: NameError: undefined local variable or method 'line' for main:Object. Это сила декларации! Научитесь читать сообщения об ошибках. Всего наилучшего!

Смежные вопросы