From: Robert Klemme Date: 2012-05-17T00:13:04+09:00 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/