Ruby的動(dòng)態(tài)語(yǔ)言特性和強大的meta-programming模型一直是讓我這種Java程序員唏噓感慨??粗?zhù)RoR可以實(shí)現那么多魔術(shù)般的事情而不費吹灰之力,我著(zhù)實(shí)想好好學(xué)學(xué)
Ruby的meta-programming??上н@方面資料好像比較少(至少我是沒(méi)有找到什么好的,JavaEye這里討論的也不多),我只能硬著(zhù)頭皮自己慢慢摸索。這篇文章只能算是一個(gè)最簡(jiǎn)單的入門(mén),給大家展示一下
Ruby中的meta-programming大概是什么樣子。
下面代碼大概會(huì )做一下事情:
- 根據指定的txt文件動(dòng)態(tài)創(chuàng )建一個(gè)class,例如“people.txt”會(huì )被創(chuàng )建為People。
- txt文件的第一行是以“,”分隔的字符串,我會(huì )把它們作為class的屬性動(dòng)態(tài)加入class。
- 動(dòng)態(tài)聲明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
-
怎么樣?真的是非常強大吧。如果什么時(shí)候,Java也能有這么強大的meta-programming就好了