From: E S Date: 2005-02-13T23:03:12+09:00 Subject: Re: evaluation order > L�hett�j�: "David A. Black" > Aihe: Re: evaluation order > > Hi -- > > On Sun, 13 Feb 2005, Robert Klemme wrote: > > > > > "Zehao" 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?]) In general that's a useful warning... I'm assuming you may mean just in a context where the statement modifier assigns to the variable? > David E