Ruby元编程起步3

创建类方法

上回我们动态创建了initialize方法,其他实例方法跟initialize如出一辙,就不介绍了,今天我们要面临的是如何创建类方法。

不过为了剧情需要,先把我们刚刚建好initialize的类给填满。
按照第一节的例子,我们来吧数据都填充到类变量@@data中去,不过为了巩固上节的知识,请先自己试着写这段代码。




module Tool
    def self.csv2class csv_name
        klass_name = csv_name.gsub('.csv', '').gsub(/\s+/, '_').downcase.capitalize
        klass = Object.const_set(klass_name, Class.new)
        File.open(csv_name ) do |file|
            attributes = file.readline.chomp.split(',')

            klass.class_eval do

                attr_accessor *attributes

                define_method :initialize do |*args|
                    attributes.each_with_index do |attribute, i|
                        instance_variable_set("@#{attribute}", args[i])
                    end
                end
		
		class_variable_set("@@data", [])
		
		file.each_line do |line|
			class_variable_get("@@data") << self.new(*line.chomp.split(','))
		end
	    
	    end
        
	end
end
end

Tool.csv2class "Friends.csv"
puts Friends.new('Lilei','M',26,'Worker').dept


好吧,虽然我知道你们根本就没有自己动手,但是……anyway,我们继续……

跑题跑了大半篇,快忘记我们要实现类方法了,在这个例子中就是find_by_name这个方法。
传统方式,我们会用def self.find_by_name来定义这个方法,但是正如前篇所说,def这个方法进入不了美丽新世界——扁平作用域,所以我们就不得不用define_method。但是问题是define_method怎么用来定义类方法?

这里我们要重新审视一下类方法(以下均是个人理解,如有雷同,很有可能)。就如第一篇讲到的,类也是一个对象(对象即实例,还记得那段绕口令么?),那么所谓的类方法是不是就是类这个对象的实例方法?(又绕口令了)

class Class
	
	def instance_method_for_demo
		puts "This is a instance method for #{self}"
	end

end

A = Class.new
A.instance_method_for_demo

class A
	def self.class_method_for_demo
		puts "This is a class method for #{self}"
	end	
end

A.class_method_for_demo


绕口令配上这段代码,不知道各位能不能理解: 所谓类方法,是类这个对象的实例方法……写到这我终于明白自己表达能力的欠缺,只能寄希望与各位读者的聪慧,如果懂了,我们就继续下一篇……

你可能感兴趣的:(Ruby,元编程)