0

为了实现类似 DSL 的属性分配,使用了双用途访问器。但是,我正在寻找一种方法来重构明显的代码重复。

class Layer

   def size(size=nil)
     return @size unless size 
     @size = size
   end

   def type(type=nil)
     return @type unless type 
     @type = type
   end

   def color(color=nil)
     return @color unless color 
     @color = color
   end

end

我正在考虑通过与其他方法一起使用来在类方法中定义这些方法define_method来获取/设置实例变量。但是,难题是如何从类方法访问实例?

def self.createAttrMethods
     [:size,:type,:color].each do |attr|
       define_method(attr) do |arg=nil|
           #either use instance.send() or 
           #instance_variable_get/set
           #But those method are instance method !!
       end 
     end 
end 
4

1 回答 1

1

define_method块内部,self将指向类的当前实例。所以使用instance_variable_get.

class Foo
  def self.createAttrMethods
    [:size,:type,:color].each do |attr|
      define_method(attr) do |arg = nil|
        name = "@#{attr}"
        return instance_variable_get(name) unless arg
        instance_variable_set(name, arg)      
      end
    end
  end

  createAttrMethods
end

f = Foo.new
f.size # => nil
f.size 3
f.size # => 3
于 2013-05-26T11:16:17.727 回答