定义特定的attr_accessor方法以区分几种类型的实例变量
Defining specific attr_accessor methods in order to distinguish several types of instance variables
在描述 classes 时,我希望能够区分不同类型的实例变量,使用专用的 class 方法(我们称之为 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=]
显然,这显然可以使用一些清理和重构,但我认为作为一个例子,它实现了你的目标。
在描述 classes 时,我希望能够区分不同类型的实例变量,使用专用的 class 方法(我们称之为 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=]
显然,这显然可以使用一些清理和重构,但我认为作为一个例子,它实现了你的目标。