Ruby中实现类似AOP的功能

昨天看Spring in action这本书的时候,想到如果要实现AOP的功能,在Ruby中如何处理呢?

Google了一下,Javaeye中已经有几个人考虑了这个问题,几个比较关键的方法是:

alias_method:用来记录被覆盖的方法

define_method:重新定义一个方法,一般会调用alias_method保存的方法

class_eval: 根据传入字符串的值,给类增加一个方法。

下面是摘抄过来的一个例子,和Java实现类似的功能相比较,实在是简单太多了。

def run_before(m)

alias_method "__before__#{m}", m

define_method(m) {|*arg| yield(*arg); send("__before__#{m}", *arg);}

end

class Test

def run

puts "hello, my run"

end

def self.log

puts "before run"

end

end

class Test
run_before("run") {log}
end

test = Test.new
test.run

Comments are closed.