I'm sure you'll get better sugestions, but this works:

@@cols.each { |c| self.__send__ "#{c.to_s}=".to_sym, arec.shift }



Allen wrote:
> 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