如何在ruby中模拟类似Java的注解?
(好的,我有答案,概括一下http://bens.me.uk/2009/java-style-annotations-in-ruby)
发布于 2010-07-01 20:05:50
这是预期的用法:
首先,您注释一个类。
class A
extend Annotations
extend MyAnnotations
create_annotation("_foobar")
_hello({:color=>'red', :ancho=>23})
_goodbye({:color=>'green', :alto=>-123})
_foobar({:color=>'blew'})
def m1
end
def m2
end
_foobar({:color=>'cyan'})
def m3
end
end
然后,您希望检查A的注释,如下所示:
anots = A.annotations
puts anots.keys
puts anots[:m1][:_hello][:color]
puts anots[:m3][:_foobar][:color]
puts anots[:m1].key?(:_goodbye)
puts "---------------"
anots.each do |met| # each annotated method
puts "-- annotated method --"
puts met[0] # method name
met[1].each do |a| # each annotation for the method
puts "-> " + a[0].to_s # annotation name
a[1].each do |par| # each pair: key-value
puts " key=" + par[0].to_s + " value=" + par[1].to_s
end
end
end
井。为此,您将需要此模块
module Annotations
@@annotation_list = {}
@@pending = {}
def method_added(met_sym)
#puts "-> adding " + met_sym.to_s + " to class + self.to_s
if @@pending.size > 0
#puts met_sym.to_s + " is annotated "
@@annotation_list[met_sym] = @@pending
#puts @@annotation_list
else
#puts met_sym.to_s + " is not annotated "
end
@@pending = {}
end
def annotate_method(a,b)
@@pending[a] = b
end
def create_annotation(anot_sym)
code = "def #{anot_sym.to_s}(val)
annotate_method( :#{anot_sym} ,val)
end"
instance_eval code
end
def annotations
return @@annotation_list
end
end
您可以在自己的模块中定义一组注释:
module MyAnnotations
def _goodbye(val)
annotate_method(:_goodbye, val)
end
def _hello(val)
annotate_method(:_hello, val)
end
end
或者将它们直接定义到您要注释的类中:
create_annotation("_foobar")
https://stackoverflow.com/questions/3157426
复制相似问题