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/