首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Ruby中模拟类似Java的批注?

如何在Ruby中模拟类似Java的批注?
EN

Stack Overflow用户
提问于 2010-07-01 19:49:57
回答 1查看 9.8K关注 0票数 22

如何在ruby中模拟类似Java的注解?

(好的,我有答案,概括一下http://bens.me.uk/2009/java-style-annotations-in-ruby)

EN

回答 1

Stack Overflow用户

发布于 2010-07-01 20:05:50

这是预期的用法:

首先,您注释一个类。

代码语言:javascript
复制
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的注释,如下所示:

代码语言:javascript
复制
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

井。为此,您将需要此模块

代码语言:javascript
复制
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

您可以在自己的模块中定义一组注释:

代码语言:javascript
复制
module MyAnnotations

  def _goodbye(val)
    annotate_method(:_goodbye, val)
  end

  def _hello(val)
    annotate_method(:_hello, val)
  end
end

或者将它们直接定义到您要注释的类中:

代码语言:javascript
复制
create_annotation("_foobar")
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3157426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档