From: Allen Date: 2005-09-14T04:08:24+09:00 Subject: Assigning to dynamic class attributes Hi! Ruby n00b here, but experienced in Perl and Python and many others, looking for guidance in my first program. I want to build a class mirroring a flat file record that uses column names as accessor methods, I want to dynamically assign an attribute from a parsed string and assign it from the postitional list of symbols. rec = QlbRecord.new(file_line) rec.dpend += 5 puts rec.address First, I Set up the class attributes in the class. @@cols = [ :address, :classes, :status, :dpend, :cremote ] @@cols.each { |a| attr a,true } Next, I would populate the fields as such.... arec = record_string.split(/\t/) @@cols.each { |c| self.c = arec.shift } where c is the sumbol of the attribute to set. This is wrong. Am I going in the right direction? It is like using a hash data[c] = arec.shift though I want to access the columns through methods (rec.address, etc.) Is there a class in the library I should be using instead? Or do I really just need to replicate code (ick!) for each data field? address = arec.shift classes = arec.shift ... etc. ... Also, I don't completely understand how symbols work or why they are needed. Following is my class for your inspection. I can kludge something that works, but I want to learn the *best* method. Thanks! ######################## class QlbRecord @@cols = [ :address, :classes, :status, :dpend, :cremote ] @@cols.each { |a| attr a,true } def initialize(record_string=nil) from_s(record_string) if record_string end def from_s(record_string) arec = record_string.split(/\t/) @@cols.each { |c| self.c = arec.shift } ##---------------------> I want it to go to @address, @classes, etc end def to_s str='' @@cols.each { |c| str += (str>'' ? "\t" : '') + self.c } ##--------------------------------------------> from @address, etc. str end end