On Sep 23, 2010, at 7:30 AM, G Brandon Hoyt wrote:
> On 09/23/2010 05:17 AM, Pen Ttt wrote:
>> here is the class
>> class  Mycompute
>>  def initialize(str)
>>    @str=str
>>   end
>>  def values
>>    @@result=@str
>>   end
>>   def up
>>     @@result.upcase
>>   end
>> end
>> irb(main):012:0> Mycompute.new("Abc").values
>> => "Abc"
>> irb(main):013:0>
>> irb(main):014:0* Mycompute.new("Abc").up
>> => "ABC"
>> irb(main):015:0> Mycompute.new("Abc").values.up
>> NoMethodError: undefined method `up' for "Abc":String
>>  from (irb):15
>>  from :0
>>
>> would you tell me how to fix it to make
>> Mycompute.new("Abc").values.up  output  "ABC"?
> The most obvious way I see to do it is to use an object attribute
> instead of a class attribute.  in other words, @result instead of
> @@result.  Is there a reason why you want to use a class attribute in
> this instance?  A class attribute is not an attribute of the object.


You've defined #up on Mycompute instances, but not on string.  If  
Mycompute#values returned a Mycompute instance, then you could write  
the expression that way. Since #values seems to want to be a plain  
String, what about turning the expression around:

Mycompute.new("Abc").up.values

(and I do find it odd to use "values" rather than "value" since only  
one thing is returned)

class Mycompute
   def initialize(str)
     @str = str
   end
   def up
     self.class.new(@str.upcase)
   end
   def values
     @str
   end
   def to_s
     @str.dup
   end
end

irb> Mycompute.new("Abc")
=> #<Mycompute:0x63cb8 @str="Abc">
irb> Mycompute.new("Abc").up
=> #<Mycompute:0x60d74 @str="ABC">
irb> Mycompute.new("Abc").values
=> "Abc"
irb> Mycompute.new("Abc").up.values
=> "ABC"

irb> puts Mycompute.new("Abc")
Abc
=> nil
irb> puts Mycompute.new("Abc").up
ABC
=> nil
irb> puts Mycompute.new("Abc").values
Abc
=> nil
irb> puts Mycompute.new("Abc").up.values
ABC
=> nil

Does that help you?

-Rob

Rob Biedenharn		
Rob / AgileConsultingLLC.com	http://AgileConsultingLLC.com/
rab / GaslightSoftware.com		http://GaslightSoftware.com/