Ruby元编程起步1

不少测试同行都有接触过Ruby,但是如果没有接触过Ruby的元编程是一种比较遗憾的事情。今天与大家分享一个简单的小例子,希望对大家有帮助。这个例子是如何把一个csv文件映射成一个类,文件中的记录映射成这个类的实例。

Friends.csvname,gender,age,deptLi Lei,M,23,edwHan Mei-mei,F,22,b2bJim Green,M,23,TRH

我们可以为以上文件创建一个类,然后name, gender, age, dept都是这个类的属性(Attribute)。如果我们想找叫Li Lei的员工,我们可以这样写Lilei = Friends.find_by_name(‘Li Lei’)得到Li Lei的部门Lilei_dept = lilei.dept传统思路我们会这样实现:

class Friends  attr_reader :name, :gender, :age, :dept    # 类变量@@data用来存储所有记录  @@data = []    def initialize name, gender, age, dept    @name, @gender, @age, @dept = name, gender, age, dept  end    def self.find_by_name name    @@data.select {|data| data.name == name}[0]  end    # 填充@@data  File.open('Friends.csv') do |file|    file.readline  # Skip fist row    file.each_line do |line|       @@data << self.new(*line.chomp.split(','))    end  endendlilei = Friends.find_by_name('Li Lei')lilei_dept = lilei.dept

但是这样弱爆了……如果有一万个csv文件你要写一万个几乎差不多的类,谁都不想重复发明那么多轮子。但是如果你学会了元编程,就可以非常优雅的解决这个问题。1. 动态创建类元编程就是用程序写程序,具体到我们这里,我们要让程序来写出我们所期望的类。首先要想的问题是我们要给程序的输入(5秒钟思考时间)……我们所需要的信息有csv文件的名字,csv文件的结构(attributes),以及内容,但是前者可以决定后两者,所以我们紧紧需要文件名即可。有了文件名了,如何才能让程序把类建出来?据我所知有两种方法:第一种:Object.const_set(class_name, Class.new)不用查帮助文档我们也能看出来,这个方法是给常量赋值的,但是又怎么能创建类呢?答案很简单,Ruby中,类是一个常量!今天不花篇幅解释了,知道就行。第二种:Friends = Class.new这种方法一般接触过Ruby的同学都好理解,Ruby里所有东西都是对象,连类本身都是对象,具体的类是类这个类的实例……如果你看不懂这段绕口令的话,就看上面哪行代码吧。Ruby的世界很简单,所有东西都是对象(半静态语言介绍OO的时候不要说这句话了),对象就是能被它所属的类给new出来!还有一点就是,正如刚才所说,因为类又是常量,所以首字母要大写。OK,终于可以动手了,赶紧完成这个起步的起步:

module Tool  def self.csv2class csv_name     klass_name = csv_name.gsub('.csv', '').gsub(/\s+/, '_').downcase.capitalize    Object.const_set(klass_name, Class.new)  endend

世上没有绝望的处境,只有对处境绝望的人。

Ruby元编程起步1

相关文章:

你感兴趣的文章:

标签云: