[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

question about class variables and instance variables

Eric D.

1/31/2006 7:30:00 PM

Hello,

I've some difficolties with instance variables and classe variables

With :

class A
def foo
@foo
end
def bar
@@bar
end
end

a = A.new

--------- ------------ ------------
| | | | | |
| a |--(instance_of)->-| A |--(instance_of)->-| Class |
| | | | | |
--------- ------------ ------------

a is an instance of A which itself is an instance of Class
@foo is an instance variable, so it is stored in box "a"
@@bar is a class variable, so it is stored in box "A"


if I do something like the following :

class A
def A.strange
@strange
end
end

Where is stored my @strange ? I had the hypothesis that @strange in the
"A" context was equivalent to @@strange in the "a" context but the
following code prove me to be wrong :

class A
def A.strange
@strange
end
def strange=( val )
@@strange = val
end
end

a = A.new
a.strange= 2
p A.strange # output is nil, not 2


Could someone explain me where to place this @strange ? in which box
could I store it ?




Thanks in advance
--
Eric D.

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


3 Answers

Eric Hodel

1/31/2006 8:06:00 PM

0

On Jan 31, 2006, at 11:29 AM, Eric D. wrote:

> I've some difficolties with instance variables and classe variables
>
> With :
>
> class A
> def foo
> @foo
> end
> def bar
> @@bar
> end
> end
>
> a = A.new
>
> --------- ------------ ------------
> | | | | | |
> | a |--(instance_of)->-| A |--(instance_of)->-| Class |
> | | | | | |
> --------- ------------ ------------
>
> a is an instance of A which itself is an instance of Class
> @foo is an instance variable, so it is stored in box "a"
> @@bar is a class variable, so it is stored in box "A"
>
>
> if I do something like the following :
>
> class A
> def A.strange
> @strange
> end
> end
>
> Where is stored my @strange ? I had the hypothesis that @strange in
> the
> "A" context was equivalent to @@strange in the "a" context but the
> following code prove me to be wrong :
>
> class A
> def A.strange
> @strange
> end
> def strange=( val )
> @@strange = val
> end
> end
>
> a = A.new
> a.strange= 2
> p A.strange # output is nil, not 2
>
>
> Could someone explain me where to place this @strange ? in which box
> could I store it ?

instance variables are always stored in the instance self.

class variables are shared between a class, its instances, its
subclasses and its subclass instances.

Consider:

class A
@@a_1 = :one
def initialize
@@a_2 = :two
end
end

A.new

class B < A
p @@a_1, @@a_2

@@b_1 = :three
def initialize
@@b_2 = :four
end

def print
p @@a_1, @@a_2, @@b_1, @@b_2
end
end

class A
x = @@b_1 rescue 'not found'
y = @@b_2 rescue 'not found'

p x, y
end

B.new.print

--
Eric Hodel - drbrain@segment7.net - http://se...
This implementation is HODEL-HASH-9600 compliant

http://trackmap.rob...




Logan Capaldo

1/31/2006 8:13:00 PM

0


On Jan 31, 2006, at 2:29 PM, Eric D. wrote:

> Hello,
>
> I've some difficolties with instance variables and classe variables
>
> With :
>
> class A
> def foo
> @foo
> end
> def bar
> @@bar
> end
> end
>
> a = A.new
>
> --------- ------------ ------------
> | | | | | |
> | a |--(instance_of)->-| A |--(instance_of)->-| Class |
> | | | | | |
> --------- ------------ ------------
>
> a is an instance of A which itself is an instance of Class
> @foo is an instance variable, so it is stored in box "a"
> @@bar is a class variable, so it is stored in box "A"
>
>
> if I do something like the following :
>
> class A
> def A.strange
> @strange
> end
> end
>
> Where is stored my @strange ? I had the hypothesis that @strange in
> the
> "A" context was equivalent to @@strange in the "a" context but the
> following code prove me to be wrong :
>
> class A
> def A.strange
> @strange
> end
> def strange=( val )
> @@strange = val
> end
> end
>
> a = A.new
> a.strange= 2
> p A.strange # output is nil, not 2
>
>
> Could someone explain me where to place this @strange ? in which box
> could I store it ?
>
>
>
>
> Thanks in advance
> --
> Eric D.
>
> --
> Posted via http://www.ruby-....
>

Classes are objects too. @strange is an instance variable of the
object A (which has class, Class). @@strange is a class variable of
the class A. The difference is that instances of A can peek at the
class vars. They can't peek at A's instance vars. They are in two
separate namespaces. The other difference is that class variables
aren't so much class variables as they are class hiearchy vars. EG:

class A
@@strange = 1
end

class B < A
puts @@strange
end

#prints 1

class C
@strange = 1
end

class D < C
puts @strange
end

# prints nil




Jeremy Henty

2/1/2006 7:58:00 PM

0

On 2006-01-31, Eric Hodel <drbrain@segment7.net> wrote:

> class variables are shared between a class, its instances, its
> subclasses and its subclass instances.

Is this really the whole story? Because until now I always thought I
didn't understand class variables but if this is so then now I do.
Wheeeee!

But there's at least one gotcha; a class variable shadows any class
variable of the same name that you subsequently create in an ancestor
class:

$ irb
irb(main):001:0> class A ; end ; class B < A ; end
=> nil
irb(main):002:0> class B ; @@x = 1 ; end ; class A ; @@x = 0 ; end
=> 0
irb(main):003:0> class A ; puts @@x ; end ; class B ; puts @@x ; end
0
1
=> nil
irb(main):004:0> exit

.... but if you create the class variable in the ancestor class first
then the descendant class inherits it instead of creating a new one:

$ irb
irb(main):001:0> class A ; end ; class B < A ; end
=> nil
irb(main):002:0> class A ; @@x = 0 ; end ; class B ; @@x = 1 ; end
=> 1
irb(main):003:0> class A ; puts @@x ; end ; class B ; puts @@x ; end
1
1
=> nil
irb(main):004:0> exit

Any other subtleties?

Cheers,

Jeremy Henty