Hi --

On Sun, 13 Feb 2005, Robert Klemme wrote:

>
> "Zehao" <zehao.chen / gmail.com> schrieb im Newsbeitrag 
> news:1108274165.071278.164610 / z14g2000cwz.googlegroups.com...
>> One interesting thing is when running the following codes
>> 
>> File.open("testfile") |aFile| do
>>   print a while a=aFile.gets
>> end
>> 
>> one will get an error indicating a doesn't exist. This error can be
>> fixed by adding a line a="" before the print command.
>> 
>> But logically speaking, "print a" should be interpreted after
>> "a=File.gets". Is this because the interpreter couldn't find the object
>> "a" when first scanning the second line?
>
> I suspect it's the same issue as with local variables: Ruby applies a certain 
> heuristic to determine whether something is a local var or not. This 
> heuristic is based on *syntactical* order of occurrence
>
>>> def foo
>>> print a
>>> a = 10
>>> end
> => nil
>>> foo
> NameError: undefined local variable or method `a' for main:Object
>       from (irb):2:in `foo'
>       from (irb):5

It's also fun to see what happens if you run this kind of thing twice:

irb(main):005:0> puts x if x = 1
NameError: undefined local variable or method `x' for main:Object
         from (irb):5
irb(main):006:0> puts x if x = 1
1

(For clarity I've deleted the warning about using '=' in conditional.
[Matz, can't we get rid of that warning?])


David

-- 
David A. Black
dblack / wobblini.net