轻量级开发的成功秘诀,第 7 部分: Java 替代方案
2009-11-11 00:00:00 来源:WEB开发网反射
反射(Reflection) 是使用 API 找到给定对象基本构建块的能力。在 Ruby 中,反射是很容易的。一切都是对象,一切都是类。可以向任何类询问它的类、它的父类或它所支持的方法。例如,可以使用代码来向数字 4 询问它的类和它所支持的方法:
irb(main):001:0> 4.class
=> Fixnum
irb(main):002:0> 4.methods
=> ["%", "between?", "send", "<<", "prec", "modulo", "&",
"object_id", ">>", "zero?", "size", "singleton_methods",
"__send__", "equal?", "taint", "id2name", "...and so on.
在 Ruby 中,使用反射结果是容易的。为了在一个对象上调用 to_s(转换为字符串)方法,只需发送一个字符串给它:
irb(main):003:0> meth="to_s"
=> "to_s"
irb(main):004:0> i=4
=> 4
irb(main):005:0> i.send meth
=> "4"
嗯,您可以看到简化的反射。为使事情更加容易,不需要担心原语或枚举、数组或泛型的特殊情况。这是纯自然的面向对象的天堂。Java 的例子比较繁琐。但它们是必须的,因为需要用反射来取得更好的透明性。
Ruby 在另一个地方很吸引人。在 Ruby 中,能够挂到一个对象的任何部分。例如,拦截器很容易实现。因为 Ruby 允许在运行时在类或对象上面修改方法,可以简单地重命名一个现有的方法并且以旧名字插入一个新的方法。以下的极端例子拦截 Class 类里的新方法,它基于 Dave Thomas 的 Programming Ruby 一书中的一个例子:
class Class
alias_method :original_new, :new
def new(*args)
result = original_new(*args)
print "Interceptor on Class.new "
return result
end
end
更多精彩
赞助商链接