Attr_constructor

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.
#####################################################################################