[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

bug in ruby

Purandhar sairam Mannidi

5/22/2007 12:41:00 PM

class Foo
attr_accessor :bar


def foo
self.bar = 1


if false
bar = 2 # never executed
end


p self.bar # prints 1
p bar # prints nil
end
end

--
Posted via http://www.ruby-....

7 Answers

dblack

5/22/2007 12:45:00 PM

0

Mike Cahill

5/22/2007 12:49:00 PM

0

Sorry - where's the bug? You think the

p bar

should give 1? I believe you are thinking of

p @bar ??

Or have I - as I often do - missed the point? =)


-----Original Message-----
From: sairam MP <sai438@gmail.com>
Date: Tue, 22 May 2007 21:41:03
To:ruby-talk@ruby-lang.org (ruby-talk ML)
Subject: bug in ruby

class Foo
attr_accessor :bar


def foo
self.bar = 1


if false
bar = 2 # never executed
end


p self.bar # prints 1
p bar # prints nil
end
end

--
Posted via http://www.ruby-....

Peter Hickman

5/22/2007 12:50:00 PM

0

sairam MP wrote:
> if false
> bar = 2 # never executed
> end
>
There is no way that this conditional will be triggered.

if expr
...
end

will only execute the body of the if statement if expr is true. False is
never true (outside of politics), hence it is never executed.


Brian Candler

5/22/2007 12:53:00 PM

0

On Tue, May 22, 2007 at 09:41:03PM +0900, sairam MP wrote:
> class Foo
> attr_accessor :bar
>
>
> def foo
> self.bar = 1
>
>
> if false
> bar = 2 # never executed
> end
>
>
> p self.bar # prints 1
> p bar # prints nil
> end
> end

This is a bug in your understanding of the language, not in the language
itself. You've not said exactly what you think it *should* do instead of
what it does, so it's hard to give an answer tailored to improving your
understandly.

But briefly: an assignment like "bar = 2" is seen at the time the program is
*parsed* and means that an unqualified "bar" is treated as a local variable
from that point onwards until the end of that scope. Whether or not it is
actually *executed* makes no difference.

When you write "self.bar" or "self.bar=" you are explicitly making a method
call to a method "bar" or "bar=" on the current object; this is never
treated as a local variable.

If you write "bar" by itself, this is treated as a method call on the
current object *unless* an assignment of the form "bar = x" has been seen by
the parser earlier in the scope.

Regards,

Brian.

Robert Klemme

5/22/2007 12:59:00 PM

0

On 22.05.2007 14:53, Brian Candler wrote:
> On Tue, May 22, 2007 at 09:41:03PM +0900, sairam MP wrote:
>> class Foo
>> attr_accessor :bar
>>
>>
>> def foo
>> self.bar = 1
>>
>>
>> if false
>> bar = 2 # never executed
>> end
>>
>>
>> p self.bar # prints 1
>> p bar # prints nil
>> end
>> end
>
> This is a bug in your understanding of the language, not in the language
> itself. You've not said exactly what you think it *should* do instead of
> what it does, so it's hard to give an answer tailored to improving your
> understandly.
>
> But briefly: an assignment like "bar = 2" is seen at the time the program is
> *parsed* and means that an unqualified "bar" is treated as a local variable
> from that point onwards until the end of that scope. Whether or not it is
> actually *executed* makes no difference.
>
> When you write "self.bar" or "self.bar=" you are explicitly making a method
> call to a method "bar" or "bar=" on the current object; this is never
> treated as a local variable.
>
> If you write "bar" by itself, this is treated as a method call on the
> current object *unless* an assignment of the form "bar = x" has been seen by
> the parser earlier in the scope.

Additional reference material:

http://www.ruby-doc.org/docs/ProgrammingRuby/html/langua...

Kind regards

robert

Bob Showalter

5/22/2007 1:07:00 PM

0

On 5/22/07, sairam MP <sai438@gmail.com> wrote:

[ snip ]

A gentle suggestion:

"Don't claim that you have found a bug"

http://www.catb.org/~esr/faqs/smart-questions.htm...

WoNáDo

5/22/2007 1:32:00 PM

0

Robert Klemme schrieb:
> On 22.05.2007 14:53, Brian Candler wrote:
>> On Tue, May 22, 2007 at 09:41:03PM +0900, sairam MP wrote:
>>> class Foo
>>> ...
>>> if false
>>> bar = 2 # never executed
>>> end
>>> ...
>>> p bar # prints nil
>>> end
>>> end
>> But briefly: an assignment like "bar = 2" is seen at the time the
>> program is *parsed* and means that an unqualified "bar" is treated
>> as a local variable from that point onwards until the end of that scope. Whether or not it is
>> scope. Whether or not it is actually *executed* makes no difference.
> Additional reference material:
>
> http://www.ruby-doc.org/docs/ProgrammingRuby/html/langua...

It should be added in the documentation, that such an uninitialized local
variable is set to the initial value "nil".

Wolfgang Nádasi-Donner