From: Matt Mencel Date: 2012-05-17T00:32:16+09:00 Subject: Re: Passing attributes to initialize Thanks Robert, Can you explain what these new code parts are doing? I'm not clear on what is actually happening here. def initialize(blahblahblah) ........ self.class.add(self) end self.add(cl) (@members ||= []) << cl end ----- Original Message ----- From: "Robert Klemme" To: "ruby-talk ML" Sent: Wednesday, May 16, 2012 10:13:04 AM Subject: Re: Passing attributes to initialize On Wed, May 16, 2012 at 4:25 PM, Matt Mencel wrote: > Hi, > > I'm not an OOP person.  Most of the Ruby I write is just scripts and such.  I've found a good place to start using real Class objects though and am having a hard time getting my head around it. > > I have this class.  The @members attribute is an array of several 5 digit numbers (could be between 1 and 10 values in the array).  I want to be able to find objects in the Class by using one of the numbers. > > class Crosslisting >  attr_accessor :members, :title, :id > >  def initialize(members, name='', id='') >    @members = members >    @name = name >    @id = id >  end > >  def self.find_by_member(member) >    found = nil >    ObjectSpace.each_object(Crosslisting) { |o| >      found = o if o.members.include?(member) >    } >    found >  end > end > > members = ['12345','67890'] > my_obj = Crosslisting.new(members) > ap Crosslisting.find_by_member('12345') > > # OUTPUT USING AWESOME_PRINT GEM > #    attr_accessor :id = "", >    attr_accessor :members = [ >        [0] "12345", >        [1] "67890" >    ], >    attr_accessor :name = "" >> > > > This seems to work ok.  Am I doing it right or is there a better way? ObjectSpace is always a crutch. Better remember all elements somewhere (e.g. in an instance variable of the class). class Crosslisting attr_accessor :members, :title, :id def initialize(members, name='', id='') @members = members @name = name @id = id self.class.add(self) end def self.add(cl) (@members ||= []) << cl end def self.find_by_member(member) @members.find {|o| o.members.include?(member)} if @members end end >  I tried to figure out how to use 'def initialize(*args)' instead of naming all the attributes, but I'm not currently smart enough to make it work apparently. Why would you want to do that? The code of #initialize is OK the way it is. Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/