I don't know why I was using instance_variable_set... I think it was a
hangover from an earlier experiment.

  def attr_constructor(*args)
    self.class_eval %Q{
      def initialize(#{args.join(', ')})
        #{args.collect{ |setting| "@#{setting} = #{setting}\n" }}
      end
    }
  end


> -----Original Message-----
> From: Daniel Sheppard 
> Sent: Tuesday, 30 March 2004 10:43 AM
> To: ruby-talk ML
> Subject: Attr_constructor
> 
> 
> I've been writing a couple of very struct-like classes, and 
> got annoyed at having to write:
> 
> class MyStructLikeThing
>   attr_accessor :one, :two, :three, :four, :five
>   def initialize (one, two, three, four, five)
>     @one, @two, @three, @four, @five = one, two, three, four, five
>   end
> end
> 
> And how ugly that looked in the code, so I decided to try my 
> hand at whipping up an attr_constructor statement.
> 
> class Module
>   private
>   def attr_constructor(*args)
>     self.class_eval %Q{
>       def initialize(#{args.join(', ')})
>         #{args.collect{ |setting| 
> "instance_variable_set(\"@#{setting}\", #{setting})" }}
>       end
>     }
>   end
> end
> 
> class MyStructLikeThing
>   attr_accessor :one, :two, :three, :four, :five
>   attr_constructor :one, :two, :three, :four, :five
> end
> 
> It strikes me as a little cludgy. Is there a better way of 
> doing this? Is there a way to get the args variable so that 
> it can be read from within a module_eval block? 
> 
> (Note also, that I know about the Struct module, this is just 
> a simplified example) 
> 
> Daniel Sheppard
> http://jroller.net/page/soxbox 
> ##############################################################
> #######################
> This email has been scanned by MailMarshal, an email content 
> filter. 
> ##############################################################
> #######################
> 
> 
#####################################################################################
This email has been scanned by MailMarshal, an email content filter.
#####################################################################################