比如下面一个文件 people.txt
引用
name,age,weight,height
"Smith, John", 35, 175, "5'10"
"Ford, Anne", 49, 142, "5'4"
"Taylor, Burt", 55, 173, "5'10"
"Zubrin, Candace", 23, 133, "5'6"
我们的目标是什么呢?我们的目标就是实现类似于Rails中的Builder模块所做的事情,假设我们第二行数据 对象为a,那么我们可以通过a.name,a.age等等来得到他所对应的值:
class DataRecord
def self.make(file_name)
data = File.new(file_name)
header = data.gets.chomp
data.close
#首先得到文件名,然后根据文件名动态的创建此文件对应的类
class_name = File.basename(file_name,".txt").capitalize
klass = Object.const_set(class_name,Class.new)
names = header.split(",")
#设置实例变量,并且将实例变量赋值
klass.class_eval do
attr_accessor *names
define_method(:initialize) do |*values|
names.each_with_index do |name,i|
instance_variable_set("@"+name, values[i])
end
end
#当put时能打印出显示更好的结果
define_method(:to_s) do
str = "<#{self.class}:"
names.each {|name| str << " #{name}=#{self.send(name)}" }
str + ">"
end
alias_method :inspect, :to_s
end
#读取数据然后将每一行数据都放进一个数组
def klass.read
array = []
data = File.new(self.to_s.downcase+".txt")
data.gets
data.each do |line|
line.chomp!
values = eval("[#{line}]")
array << self.new(*values)
end
data.close
array
end
klass
end
end
DataRecord.make("people.txt")
list = People.read
p list[1].name
p list[1].age
分享到:
相关推荐
A metaprogram is a program that generates or manipulates program code. Ever since generic programming was introduced to C++, programmers have discovered myriad "template tricks" for manipulating ...
无论如何,所有读者都将获得一个可以自由支配的、威力空前的新工具:Boost Metaprogramming Library。 附赠光盘内容包含所有Boost C++ 程序库:Boost Metaprogramming Library及其参考文件,还包含所有随书代码示例...
C++三大编程方向:面向对象、泛型编程、模板元编程之一的描述专著,分两卷压缩,此为第一卷。 本书是关于C++模板元编程的著作。本书主要介绍Traits和类型操纵、深入探索元函数、整型外覆器和操作、序列与迭代器、...
C++高级模板编程,为英文原版,系统性讲述函数模板和类模板,具体内容参见文档,本书共分12个章节,外加2个附录,仅供学习使用。
两本很好的讲解c++ template的书
monster:现代C ++中的模板元编程(TMP)的艺术