Class variable confusion

Discussion in 'Ruby' started by Keith Salisbury, Apr 23, 2009.

  1. Hi,

    Could someone explain how i get this to work please:

    module Keith
    def self.greeting
    @greeting ||= "hello"
    end
    def self.greeting=(value)
    puts "updating knowledge"
    @greeting = value
    end
    def self.speak
    puts greeting
    end
    def self.learn_ruby
    self.greeting = "ruby"
    end
    def self.learn_french
    learn_language(greeting, "bonjour")
    end
    def self.learn_language(prop, value)
    puts prop.inspect
    prop = value
    puts prop.inspect
    #p =
    value
    end
    end

    Keith.speak
    Keith.learn_ruby
    Keith.learn_french
    Keith.speak



    This outputs:

    hello
    updating knowledge
    "ruby"
    "bonjour"
    ruby


    I can't for the life of me get it to work...


    many thanks
    keith
    --
    Posted via http://www.ruby-forum.com/.
     
    Keith Salisbury, Apr 23, 2009
    #1
    1. Advertising

  2. Or more simply, i would like this to update the variable @greeting, when
    i call Keith.learn_french:

    module Keith
    def self.greeting
    @greeting ||= "hello"
    end
    def self.greeting=(value)
    puts "updating knowledge"
    @greeting = value
    end
    def self.speak
    puts greeting
    end
    def self.learn_french
    learn_language(greeting, "bonjour")
    end
    def self.learn_language(prop, value)
    prop = value
    end
    end

    Keith.speak
    Keith.learn_french
    Keith.speak

    But the only way i can get it to work is using this:

    module Keith
    def self.greeting
    @greeting ||= "hello"
    end
    def self.greeting=(value)
    puts "updating knowledge"
    @greeting = value
    end
    def self.speak
    puts greeting
    end
    def self.learn_french
    self.greeting = learn_language(greeting, "bonjour")
    end
    def self.learn_language(prop, value)
    prop = value
    end
    end

    Keith.speak
    Keith.learn_french
    Keith.speak


    Which is basically the same as:

    module Keith
    def self.greeting
    @greeting ||= "hello"
    end
    def self.greeting=(value)
    puts "updating knowledge"
    @greeting = value
    end
    def self.speak
    puts greeting
    end
    def self.learn_french
    self.greeting = "bonjour"
    end
    end

    Keith.speak
    Keith.learn_french
    Keith.speak


    --
    Posted via http://www.ruby-forum.com/.
     
    Keith Salisbury, Apr 23, 2009
    #2
    1. Advertising

  3. On Thu, Apr 23, 2009 at 4:01 PM, Keith Salisbury
    <> wrote:
    > Or more simply, i would like this to update the variable @greeting, when
    > i call Keith.learn_french:
    >
    > module Keith
    > =A0def self.greeting
    > =A0 =A0@greeting ||=3D "hello"
    > =A0end
    > =A0def self.greeting=3D(value)
    > =A0 =A0puts "updating knowledge"
    > =A0 =A0@greeting =3D value
    > =A0end
    > =A0def self.speak
    > =A0 =A0puts greeting
    > =A0end
    > =A0def self.learn_french
    > =A0 =A0learn_language(greeting, "bonjour")


    Here, you are calling the greeting method (which returns "hello")

    > =A0end
    > =A0def self.learn_language(prop, value)
    > =A0 =A0prop =3D value


    Here you are reassigning a local variable, which goes out of scope
    when the method ends.
    Try this:


    jesus@jesus-laptop:~/temp/ruby$ ruby class_variables.rb
    hello
    bonjour

    jesus@jesus-laptop:~/temp/ruby$ cat class_variables.rb
    module Keith
    def self.greeting
    @greeting ||=3D "hello"
    end
    def self.greeting=3D(value)
    puts "updating knowledge"
    @greeting =3D value
    end
    def self.speak
    puts greeting
    end
    def self.learn_french
    learn_language:)@greeting, "bonjour")
    end
    def self.learn_language(prop, value)
    instance_variable_set(prop, value)
    end
    end

    Keith.speak
    Keith.learn_french
    Keith.speak


    or if you want to call the self.greeting=3D method, try this variation:

    def self.learn_french
    learn_language:)greeting, "bonjour")
    end
    def self.learn_language(prop, value)
    send("#{prop}=3D", value)
    end

    Hope this helps,

    Jesus.
     
    Jesús Gabriel y Galán, Apr 23, 2009
    #3
  4. Keith Salisbury, Apr 23, 2009
    #4
  5. Hi --

    Keith Salisbury wrote:
    > Jesús Gabriel y Galán wrote:
    >> Hope this helps,
    >>
    >> Jesus.

    >
    > Legend
    >
    > Thankyou!!


    It's worth mentioning that none of the code in this thread contains any
    class variables. What you've got are instance variables (belonging to a
    class object). Class variables look like @@this.


    David

    --
    David A. Black / Ruby Power and Light, LLC
    Ruby/Rails consulting & training: http://www.rubypal.com
    Now out in PDF: The Well-Grounded Rubyist (http://manning.com/black2)
    "Ruby 1.9: What You Need To Know" Envycasts with David A. Black
    http://www.envycasts.com
     
    David A. Black, Apr 23, 2009
    #5
  6. On Apr 23, 2009, at 10:01 AM, Keith Salisbury wrote:

    > Or more simply, i would like this to update the variable @greeting,
    > when
    > i call Keith.learn_french:
    >
    > module Keith
    > def self.greeting
    > @greeting ||= "hello"
    > end
    > def self.greeting=(value)
    > puts "updating knowledge"
    > @greeting = value
    > end
    > def self.speak
    > puts greeting
    > end
    > def self.learn_french
    > learn_language(greeting, "bonjour")
    > end
    > def self.learn_language(prop, value)
    > prop = value
    > end
    > end
    >
    > Keith.speak
    > Keith.learn_french
    > Keith.speak
    >
    > But the only way i can get it to work is using this:
    >
    > module Keith
    > def self.greeting
    > @greeting ||= "hello"
    > end
    > def self.greeting=(value)
    > puts "updating knowledge"
    > @greeting = value
    > end
    > def self.speak
    > puts greeting
    > end
    > def self.learn_french
    > self.greeting = learn_language(greeting, "bonjour")
    > end
    > def self.learn_language(prop, value)
    > prop = value
    > end
    > end
    >
    > Keith.speak
    > Keith.learn_french
    > Keith.speak
    >
    >
    > Which is basically the same as:
    >
    > module Keith
    > def self.greeting
    > @greeting ||= "hello"
    > end
    > def self.greeting=(value)
    > puts "updating knowledge"
    > @greeting = value
    > end
    > def self.speak
    > puts greeting
    > end
    > def self.learn_french
    > self.greeting = "bonjour"
    > end
    > end
    >
    > Keith.speak
    > Keith.learn_french
    > Keith.speak
    > --
    > Posted via http://www.ruby-forum.com/.



    Keeping the other methods the same:

    module Keith
    def self.learn_french
    learn_language:)greeting, "bonjour")
    end
    def self.learn_language(prop, value)
    self.send("#{prop}=", value)
    end
    end


    irb> Keith.speak
    hello
    => nil
    irb> Keith.learn_french
    updating knowledge
    => "bonjour"
    irb> Keith.speak
    bonjour
    => nil

    Although I'd think that you'd be better with a Speaker class and do:
    Keith = Speaker.new
    Then you'd be dealing with instance variables on instances of the
    Speaker class rather than instance variables on the Keith module.
    Contrary to what you might think, you don't have class variables in
    your code. (Those would be @@greeting)

    -Rob

    Rob Biedenharn http://agileconsultingllc.com
     
    Rob Biedenharn, Apr 23, 2009
    #6
    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. E11
    Replies:
    1
    Views:
    4,788
    Thomas Weidenfeller
    Oct 12, 2005
  2. Variable length array confusion

    , Sep 29, 2003, in forum: C Programming
    Replies:
    5
    Views:
    366
    -berlin.de
    Oct 3, 2003
  3. wanwan
    Replies:
    3
    Views:
    432
    Alex Martelli
    Oct 14, 2005
  4. gyro
    Replies:
    1
    Views:
    249
    Diez B. Roggisch
    Feb 14, 2009
  5. Replies:
    10
    Views:
    196
Loading...

Share This Page