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 / AgileConsultingLLC.com