【问题标题】:How can I tell if a method is read-write, read-only, or write-only, via introspection?如何通过自省判断一个方法是读写、只读还是只写?
【发布时间】:2011-05-11 15:28:51
【问题描述】:

我来自 Java,想知道是否可以使用自省为对象“设置”实例变量。

例如,如果我有以下类声明,带有两个实例变量 first_attributesecond_attribute

class SomeClass  
  attr_accessor :first_attribute
  attr_reader :second_attribute

  def initialize()  
    # ...
  end
end

我希望能够获取实例方法,大概是通过调用SomeClass.instance_methods 并知道哪些实例方法是读/写与只读的。

在 Java 中我可以这样做:

PropertyDescriptor[] properties = PropertyUtils.GetPropertyDescriptors(SomeClass);
for (prop : properties) {
  if (prop.getWriteMethod() != null) {
    //  I can set this one!
  }
}

如何在 Ruby 中做到这一点?

【问题讨论】:

标签: ruby introspection


【解决方案1】:

没有像 Java 属性这样的内置功能,但您可以像这样轻松地做到这一点:

self.class.instance_methods.grep(/\w=$/)

这将返回类中所有 setter 方法的名称。

【讨论】:

  • attr_reader :x 添加x 方法,这是一个getter。 attr_writer :x 添加x= 方法,即setter。 attr_accessor :x 两者兼而有之。简而言之,通过使用这些“宏”,您可以向您操作字段的类添加方法。所以奥斯汀泰勒是正确的;仅将实例方法过滤到以单个“=”结尾的实例方法,然后您将获得 setter 方法。如果您还有 5 分钟的额外时间,请查看这篇短文:rubyist.net/~slagell/ruby/accessors.html
  • 请注意,在 Ruby 中,在定义新类时,实际上会在 Class 上下文中执行代码,因此 self.class.instance_methodsself.instance_methods 的使用取决于编写此代码的上下文。当前者在inside方法定义和后者outside方法定义时,它们产生相同的结果。
猜你喜欢
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
相关资源
最近更新 更多