From: Robert Dober Date: 2007-07-29T18:11:48+09:00 Subject: Re: how can i use a ruby class in object way On 7/29/07, Guo Yangguang wrote: > Sorry ,i am not show it very clear.Please read this example again: > > class Test > def Test.say_hello > puts "Hello from #{self.name}" > puts "hello from #{self.class}" > end > say_hello #i don't understand here ok I see now, well this is "simple" once you have grasped the concept, but quite difficult before -- as so often ;) It might be helpful to grasp the concept of self before, I'd advice Pickaxe for that http://www.ruby-doc.org/docs/ProgrammingRuby/ now in Ruby there is always a self defined, the implicit receiver to which unqualified messages are sent Fire up your irb to learn a little bit more about that 536/37 > irb irb(main):001:0> self => main # This is the default self provided by the Ruby Interpreter irb(main):002:0> class Test ### look what happens to self when inside a class statement irb(main):003:1> puts self irb(main):004:1> end Test => nil irb(main):005:0> class Test ### say_hello is sent to self, which is Test in this context irb(main):006:1> say_hello ### but Test does not reply to this message yet irb(main):007:1> end NameError: undefined local variable or method `say_hello' for Test:Class from (irb):6 from :0 irb(main):008:0> class Test ### The def statement defines an *instance* method on self, we have therefore ### to write Test.say_hello in order to tell def a method on Test itself, but you ### seem to know that already :) irb(main):009:1> def Test.say_hello irb(main):010:2> puts "Hello" irb(main):011:2> end irb(main):012:1> end => nil irb(main):013:0> class Test ### self is set to Test again and now Test responds to the #say_hello message irb(main):014:1> say_hello irb(main):015:1> end Hello => nil ### and just to show that the main object was not influenced by what we defined for Test irb(main):020:0> say_hello NameError: undefined local variable or method `say_hello' for main:Object from (irb):20 from :0 irb(main):021:0> > end > > > > Normally,we can use a class anyplaces after defining it ,but in this > example,i use a classmehod immediately after defining it "in class > context".This is valid.I means calling a classmethod(not an intance > method) in a class defintion--not after defining that class--is valid > .Can you explain it for me? thank you ! Funny but you explained it quite well, if there were no ? I would say you have made a correct statement. Maybe you are just puzzled by the dynamic nature of Ruby that everything springs into life when executed. class Test dosomething end as a matter of fact is equivalent to Test = Class::new class Test #(1) doesomething end meaning that at point (1) Test is a well defined complete Ruby class already :) HTH Robert > > > > > > > > > Robert Dober wrote: > > On 7/29/07, Guo Yangguang wrote: > >> end > >> say_hello > >> end > >> > > It is not completely clear what you want to achieve but some remarks > > might be helpful > > > > class Test > > def initialize > > e="e" # this code is not realy useful, e is a scope local > > variable that will be thrown away, you probably want to do this: > > @e = "e" # this is an instance variable > > end > > > > attr_accessor :e # for some tests below > > > > def Test.say_hello > > ... > > end > > say_hello > > end > > > > Test.say_hello > > aTest = Test.new > > puts aTest.e > > aTest.e = 42 > > puts aTest.e > > -- > Posted via http://www.ruby-forum.com/. > > -- [...] as simple as possible, but no simpler. -- Attributed to Albert Einstein