instance variables as class variable ?

W

wbsurfver

I'm trying to get a handle on why the following code works by printing
out 'frog'
because @x looks like instance variable syntax. I know that some of
these things don't work the way I'd expect.

class Test
@x = 'frog'

class << self
attr_reader :x
end

end

puts Test.x
 
R

Rick DeNatale

I'm trying to get a handle on why the following code works by printing
out 'frog'
because @x looks like instance variable syntax. I know that some of
these things don't work the way I'd expect.

class Test
@x = 'frog'

class << self
attr_reader :x
end

end

puts Test.x

Well it is an instance variable, of the class. This is commonly
called a class instance variable, not to be confused with a class
variable.

Within the lexical scope of class..end self is the class, so @x is an
instance variable of the class.

Consider this:

class Test

# self here is Test which holds the methods for its instances

attr_reader :x # this is actually a message sent to Test, which
defines an instance method
end

Now when you say
class Test
class << self # (which could also be class << Test)
#self becomes the singleton class of Test.
attr_reader :x # and here the attr_reader message is sent to
Test's singleton class
# resulting in an "instance method" in
the singleton class which is a
# class method of Test

end
end
 
W

wbsurfver

Hi,

Thanks for all the helpful comments, I will have a look at that site
and study this some more. I kind of understand I think the gist of
this. I do love Ruby and Rails to the point of almost an obsession,
but my first impression of this particular instance question is that
it seems sort of unintuitive at first pass anyway.

When I first read about class and instance variables I thought I
understood it until I saw some of these other types of examples. I
wrote another test program below which prints the 2 different values
of @x, I was out walking the dog thinking about this and I decided I
needed to try this one example out to make sure I knew what it did,
and I wasn't exactly sure what it was going to do until I tried it.


#=========================

class Test
@x = 'frog'

def initialize
@x = "green"
end

def prx
puts @x
end

class << self
attr_accessor :x
end

end

puts Test.x
test = Test.new
test.prx
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,904
Latest member
HealthyVisionsCBDPrice

Latest Threads

Top