[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

method self.a= and a= create different instance variables

yuesefa

7/25/2006 6:19:00 PM

i try this in irb .

irb(main):001:0> def a=(a)
irb(main):002:1> @a=a
irb(main):003:1> end
=> nil
irb(main):004:0> def a
irb(main):005:1> @a
irb(main):006:1> end
=> nil
irb(main):007:0> a=1
=> 1
irb(main):008:0> a
=> 1
irb(main):009:0> self.a=2
=> 2
irb(main):010:0> a
=> 1
irb(main):011:0> self.a
=> 2

a and a= should be private methods of Object. so call of a or self.a
should do the same thing. but it's not. i am now confused.

4 Answers

dblack

7/25/2006 6:40:00 PM

0

Tom Rauchenwald

7/25/2006 6:45:00 PM

0

yuesefa <yuesefa@gmail.com> writes:

> i try this in irb .
>
> irb(main):001:0> def a=(a)
> irb(main):002:1> @a=a
> irb(main):003:1> end
> => nil
> irb(main):004:0> def a
> irb(main):005:1> @a
> irb(main):006:1> end
> => nil
> irb(main):007:0> a=1
> => 1
> irb(main):008:0> a
> => 1

irb(main):010:0> @a
=> nil
irb(main):011:0> self.a
=> nil
That means that not the method a= was called, but the local variable a was set
to one.

> irb(main):009:0> self.a=2
> => 2

Here you expicitly call the method, so @a is set to 2.

> irb(main):010:0> a
> => 1

But the local variable a is still 1.

> irb(main):011:0> self.a
> => 2

Here the method a is explicitly called, so you get what you expected.

> a and a= should be private methods of Object. so call of a or self.a
> should do the same thing. but it's not. i am now confused.

It's simply because the ruby-interpreter can't tell what you want when you
write a=1 -- do you want to set a to 1, or do you want to call the method a?

HTH,
Tom

yuesefa

7/25/2006 6:51:00 PM

0

thank both of u, i am clear now :-)

Leslie Viljoen

7/25/2006 7:06:00 PM

0

On 7/25/06, dblack@wobblini.net <dblack@wobblini.net> wrote:
> Hi --
>
> On Wed, 26 Jul 2006, yuesefa wrote:
>
> > i try this in irb .
> >
> > irb(main):001:0> def a=(a)
> > irb(main):002:1> @a=a
> > irb(main):003:1> end
> > => nil
> > irb(main):004:0> def a
> > irb(main):005:1> @a
> > irb(main):006:1> end
> > => nil
> > irb(main):007:0> a=1
> > => 1
> > irb(main):008:0> a
> > => 1
> > irb(main):009:0> self.a=2
> > => 2
> > irb(main):010:0> a
> > => 1
> > irb(main):011:0> self.a
> > => 2
> >
> > a and a= should be private methods of Object. so call of a or self.a
> > should do the same thing. but it's not. i am now confused.
>
> When you write:
>
> a = 1
>
> Ruby parses that as a local variable assignment. In other words,
> methods ending in = always require that you provide an explicit
> receiver (in this case "self").

also,

@a

will give you the same as

self.a

which makes sense because you are "inside" the definition of Object:

irb(main):085:0> self
=> #<Object:0x277fa2c @a=7>

Les