C++的宏大家用得很开心,但可读性不太好。
宏就是代码级动态,非运行时,是非常有需求的!
Ruby的define_method和class_eval都有闭包能力。但有时可读性也不那么好,class_eval更是。
例子:
class Class
def plugin
class_eval do
def self.print
p 'inspect me!'
end
end
end
end
module Core
def plugin_d klass
define_singleton_method("printx") do
p klass.name
end
end
def plugin_dd klass
class_eval <<-RUBY
def self.printy
p #{klass}.name
end
RUBY
end
def plugin_ddd klass
define_singleton_method("printz") do
p klass.superclass.name
end
end
def plugin_dddd klass
class_eval <<-RUBY
def self.printzz
p #{klass}.superclass.name
end
RUBY
end
end
class A
extend Core
plugin
plugin_d String
plugin_dd Integer
plugin_ddd Integer
plugin_dddd Integer
end
A.print
A.printx
A.printy
A.printz
A.printzz
输出
"inspect me!"
"String"
"Integer"
"Numeric"
"Numeric"
显然print方法能力闭包求值外部变量的能力。
define_singleton_method和class_eval都有,显然后者的可读性差一些,但效率要高。原因是class_eval是用语法解析后,直接变成了一个方法。而define_method生成了一个proc。proc再调用性能就差一点了。