ruby - 定义特定的 attr_accessor 方法以区分几种类型的实例变量

标签 ruby metaprogramming

在描述类时,我希望能够使用专用的类方法(我们称之为 my_attrs_1、my_attrs_2)来区分不同类型的实例变量。像这样的东西:

class DesignUnit
  attrs_1 :a,:b
  attrs_2 :c  
end

这样我就可以像这样遍历这些不同的实例变量:

du=DesignUnit.new
#...
du.attrs_1.each do ...
   #I get a, and b
end

我的出发点是查看如何自定义 attr_acessor 定义(例如 here ),但我没有成功使其工作。

最佳答案

你的意思是这样的吗?

module CustomAttributeCollector
  def self.included(base)
    base.extend(ClassMethods)
  end
  module ClassMethods
    def attrs_1(*args)
      @_attrs_1 ||= []
      (args - @_attrs_1).each do |arg|
        attr_accessor arg
        @_attrs_1 << arg
      end
    end
    def attrs_2(*args)
      @_attrs_2 ||= []
      (args - @_attrs_2).each do |arg|
        attr_accessor arg
        @_attrs_2 << arg
      end    
    end
  end
  def attrs_1 
    self.class.instance_variable_get("@_attrs_1")
  end
  def attrs_2
    self.class.instance_variable_get("@_attrs_2")
  end 
end     

class DesignUnit
 include CustomAttributeCollector
  attrs_1 :a,:b
  attrs_2 :c
end

然后

du = DesignUnit.new
du.attrs_1
#=> [:a,:b]
du.attrs_2
#=> [:c]
du.methods.sort - Object.methods
#=> [:a, :a=, :attrs_1, :attrs_2, :b, :b=, :c, :c=]

显然,这显然可以使用一些清理和重构,但我认为作为一个例子,它可以实现您的目标。

关于ruby - 定义特定的 attr_accessor 方法以区分几种类型的实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30487826/

相关文章:

templates - 如何从 mixin mixin 模板调用构造函数

ruby - 属性值无

regex - 如何在提取匹配项时验证 Ruby 中字符串的格式?

ruby - 如何在 Ruby 中为类变量编写编写器方法?

dataframe - Julia 中的动态函数名称定义.. 可能吗?

c++ - C++ 预处理器元编程图灵完备吗?

ruby - 如何执行 Dir.glob 但排除目录?

ruby - 全局符号上下文中的类与实例方法

ruby - linux 上的 win32-api 安装问题

c++ - 绑定(bind)元函数 : accept both types and template template parameters (accept anything)