Tom Cloyd
3/15/2008 7:55:00 AM
Stefano Crocco wrote:
> On Saturday 15 March 2008, Tom Cloyd wrote:
>
>> Joel VanderWerf wrote:
>>
>>> Tom Cloyd wrote:
>>>
>>>> Joel VanderWerf wrote:
>>>>
>>>>> Tom Cloyd wrote:
>>>>>
>>>>>> I read in <Programming Ruby 2nd ed.> (p. 303) - ""If Ruby comes
>>>>>> across a line anywhere in the source containing just ?_ _END_ _?,
>>>>>> with no leading or trailing whitespace, it treats that line as the
>>>>>> end of the program?any subsequent lines will not be treated as
>>>>>> program code."
>>>>>>
>>>>>> That's not what's happening for me. The following -
>>>>>> _ _END_ _
>>>>>> __END__
>>>>>> _END_
>>>>>>
>>>>>> all produce the same result for me - "undefined local variable or
>>>>>> method"
>>>>>> That DOES bring the program to an abrupt end, but its rather
>>>>>> ungraceful. Is this the intended result - a crash due to an
>>>>>> interpreter error?
>>>>>>
>>>>> What the quote (a bit ambiguous perhaps) means is that the __END__
>>>>> line and following lines are not treated as part of the program
>>>>> text. It has nothing to do with control flow. It's like comment
>>>>> block that runs to the end of the file without any explicit
>>>>> termination. (It's more than that because you can read it with DATA.)
>>>>>
>>>> OK, but couldn't ANY uninitialized variable achieve the same messy
>>>> result? What's the point? This surely can't be the intended result.
>>>> Makes no sense to me.
>>>>
>>> __END__ by itself on a line shouldn't exit the program. If you're
>>> getting that error, maybe there is an extra char on the line. A space
>>> perhaps?
>>>
>> Yes, that would explain it, but I made sure this problem didn't occur
>> from the beginning, which is one reason I'm puzzled. I really don't see
>> anything wrong with what I'm feeding the interpreter.
>>
>> So, I did a different test program -
>>
>> require 'readline'
>> puts "test under way\ninput var: "
>> #opt = readline( "=--> \n")
>> opt = gets.chomp
>> puts( opt)
>> __END__
>> puts( opt)
>>
>> result:
>> test under way
>> input var:
>> 5
>> 5
>>
>> Here, we don't get an error. We just get ignored.
>> This is nuts.
>>
>> t.
>>
>
> As others said, when ruby sees the __END__ identifier on a line by itself
> (without leading or trailing spaces), it treats it, and any text following it,
> approximately as a comment. This means that the code is not parsed (syntax
> errors after that line aren't recognized) and, obviously, not executed.
> Besides, the constant DATA is set to a File object which contains that text.
>
> This is consistent with the result you get from your piece of code: without
> the __END__, 5 would have been written 3 times: the first when you entered it
> from the keyboard, the other two because of the two puts. Since the second
> puts is after __END__, instead, you only get it twice: the second puts is
> ignored.
>
> Try this, for example:
>
> puts "This is the class of DATA: #{DATA.class}"
> puts "These are the contents of DATA:\n\n#{DATA.read}"
> __END__
> This is not valid ruby code
>
> The output is:
> This is the class of DATA: File
> These are the contents of DATA:
>
> This is not valid ruby code
>
> Of course, removing the __END__ line causes a syntax error:
>
> ./prova.rb:6: syntax error, unexpected kNOT, expecting $end
> This is not valid ruby code
>
> Regarding your first piece of code (the one which produces the NoMethodError),
> are you sure the error isn't produced before end?
>
> Stefano
>
>
>
Stefano,
You're right. I misread my own output - seeing two 5's, I thought them
to be output, without realizing that the first wasn't. Yes, it's getting
a bit late here. Maybe it's time to stop.
Thanks to you and Joel for your comments!
t.
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tom Cloyd, MS MA, LMHC
Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< tc@tomcloyd.com >> (email)
<< TomCloyd.com >> (website & psychotherapy weblog)
<< sleightmind.wordpress.com >> (mental health issues weblog)
<< directpathdesign.com >> (web site design & consultation)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~