A metaprogramming solution
class DataRecord
def self.make(file_name)
data = File.open(file_name)
header = data.gets.chomp
class_name = File.basename(file_name,".txt").capitalize # "foo.txt" => "Foo"
klass = Object.const_set(class_name,Class.new)
klass.instance_variable_set("@file",data)
klass.const_set(:Names,header.split(","))
klass.class_eval do
attr_accessor *klass::Names
define_method(:initialize) do |*values|
klass::Names.each_with_index do |name,i|
instance_variable_set("@"+name, values[i])
end
end
def klass.read
array = []
@file.each do |line|
line.chomp!
values = eval("[#{line}]")
array << self.new(*values)
end
@file.close
array
end
define_method(:inspect) do
str = "#{self.class} object: "
klass::Names.each {|name| str << "#{name}=#{self.send(name)} " }
str
end
alias_method :to_s, :inspect
end
klass
end
end
this_class = DataRecord.make("people.txt")
list = this_class.read
puts list
that_class = DataRecord.make("places.txt")
list = Places.read # Note I can use this name
puts list
|
|