Ruby里的元编程

一个场景 元编程在所有的Lisp系语言中应该都是一个必备的feature,coommon lisp, scheme等包含该功能自然不在话下,而比较主流的编程语言如JavaScript,python之流,也或多或少的受到了lisp得影响,在面向对象的同时,也嵌入了一些元编程的特性。 而元编程在ruby中,虽然不如在lisp的宏那样灵活/强大,但是对于被“主流”编程语言影响很久的程序员 – 如我,来说,已经非常震撼了。 很多ruby程序员都是通过rails才慢慢接触到ruby本身的,在rails中,ORM是通过强大到无穷大得ActiveRecord来完成的。 一个简单的示例如: class Person < ActiveRecord::Base end 对应的,数据库中有一个Person的表: CREATE TABLE person ( id int(11) NOT NULL auto_increment, name varchar(255), age int, email varchar(255), PRIMARY KEY (id) ); 这样,在使用模型Person的地方,可以很容易的编写这样的代码: juntao = Person.new juntao.name = 'juntao' juntao.age = 28 juntao.email = 'juntao.qiu@gmail.com' juntao.save 也就是说,开发者仅仅需要简单的创建一个与数据库同名的ruby类,然后这个类(Person)只需要继承自ActiveRecord::Base,那么它就自动的获得了很多的功能。这些神奇的功能就是通过ruby的元编程来完成的。 一个ActiveRecord的拙劣模仿 我们在这里将编写一个简单的类InactiveRecord,当有其他类继承自此类时,会完成如ActiveRecord那样的功能,当然第一步我们并没有数据校验之类的功能,只是简单的将数据存储起来即可: 在person.rb文件中 class Person < InactiveRecord::Base end 在address.rb中: class Address < InactiveRecord::Base end 而在使用他们的地方: require './person' require './address' def test juntao = Person....

December 15, 2013 · 3 min · 邱俊涛 | Juntao Qiu