instance variables as class variable ?

Discussion in 'Ruby' started by wbsurfver@yahoo.com, Nov 15, 2007.

  1. Guest

    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
     
    , Nov 15, 2007
    #1
    1. Advertising

  2. On Nov 15, 2007 3:15 PM, <> wrote:
    >
    > 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



    --
    Rick DeNatale

    My blog on Ruby
    http://talklikeaduck.denhaven2.com/
     
    Rick DeNatale, Nov 15, 2007
    #2
    1. Advertising

  3. Brian Marick Guest

    @x is an instance variable belonging to the object-that-is-a-class,
    not to an-object-that-is-an-instance-of-that-class. I cover this with
    some helpful pictures here:
    <http://www.visibleworkings.com/little-ruby/>

    Drawing pictures really helps in figuring out what's going on.


    On Nov 15, 2007, at 2:15 PM, wrote:

    >
    > 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


    -----
    Brian Marick, independent consultant
    Mostly on agile methods with a testing slant
    www.exampler.com, www.exampler.com/blog, twitter.com/marick



    -----
    Brian Marick, independent consultant
    Mostly on agile methods with a testing slant
    www.exampler.com, www.exampler.com/blog, twitter.com/marick
     
    Brian Marick, Nov 15, 2007
    #3
  4. Guest

    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
     
    , Nov 16, 2007
    #4
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    10
    Views:
    36,024
    jporter892
    Jun 6, 2011
  2. Gerry Sutton
    Replies:
    1
    Views:
    584
    Peter Otten
    Apr 16, 2005
  3. David Garamond
    Replies:
    5
    Views:
    279
    Ara.T.Howard
    Jun 8, 2004
  4. Lionel Thiry
    Replies:
    19
    Views:
    385
    Randy Kramer
    Mar 15, 2005
  5. Eric D.
    Replies:
    3
    Views:
    194
    Jeremy Henty
    Feb 1, 2006
Loading...

Share This Page