Ruby的动态语言特性和强大的meta-programming模型一直是让我这种Java程序员唏嘘感慨。看着RoR可以实现那么多魔术般的事情而不费吹灰之力,我着实想好好学学
Ruby的meta-programming。可惜这方面资料好像比较少(至少我是没有找到什么好的,JavaEye这里讨论的也不多),我只能硬着头皮自己慢慢摸索。这篇文章只能算是一个最简单的入门,给大家展示一下
Ruby中的meta-programming大概是什么样子。
下面代码大概会做一下事情:
- 根据指定的txt文件动态创建一个class,例如“people.txt”会被创建为People。
- txt文件的第一行是以“,”分隔的字符串,我会把它们作为class的属性动态加入class。
- 动态声明class的initialize方法和to_s方法。
代码如下:
ruby 代码
- class MetaProgrammingTest
-
-
- def self.create_class(file_name)
-
- class_name = File.basename(file_name,".txt").capitalize
-
- klass = Object.const_set(class_name,Class.new)
-
-
- first_line = ''
- File.open(file_name) { |io| first_line = io.gets.chomp }
- names = first_line.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
-
-
-
-
- define_method(:to_s) do
- str = "[#{self.class}:"
- names.each {|name| str << " #{name}=#{self.send(name)}" }
- str + "]"
- end
-
- end
-
-
- klass
- end
-
- end
-
-
- klass = MetaProgrammingTest.create_class('people.txt')
- klass_instance = klass.new('001', 'Allen Young', 23)
- puts klass_instance.to_s
-
- puts klass_instance.inspect
-
怎么样?真的是非常强大吧。如果什么时候,Java也能有这么强大的meta-programming就好了