Bug in ruby


#1

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


#2

Hi –

On Tue, 22 May 2007, sairam MP wrote:

end

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

That’s not a bug. The parser sees:

bar = 2

and that triggers the allocation of bar. Since the expression is
inside of the if false block, it never gets executed, so bar is nil.

David


#3

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? =)


#4

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.


#5

On Tue, May 22, 2007 at 09:41:03PM +0900, sairam MP wrote:

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.


#6

— sairam MP removed_email_address@domain.invalid wrote:

end

____________________________________________________________________________________Luggage?
GPS? Comic books?
Check out fitting gifts for grads at Yahoo! Search
http://search.yahoo.com/search?fr=oni_on_mail&p=graduation+gifts&cs=bz


#7

On 5/22/07, sairam MP removed_email_address@domain.invalid wrote:

[ snip ]

A gentle suggestion:

“Don’t claim that you have found a bug”

http://www.catb.org/~esr/faqs/smart-questions.html#id270918


#8

On 22.05.2007 14:53, Brian C. wrote:

  bar = 2        # never executed

what it does, so it’s hard to give an answer tailored to improving your

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/language.html#UO

Kind regards

robert


#9

Robert K. schrieb:

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/language.html#UO

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

Wolfgang Nádasi-Donner