Ruby元编程:访问类名

时间:2013-11-25 04:02:40

标签: ruby metaprogramming

我对Ruby元编程很新。我正在尝试编写生成代码的代码 使用应传递给构造函数的字段列表创建类时的“dup”函数。但是,当我创建它时,我无法弄清楚如何访问我正在创建的类的名称。

例如,如果我有这段代码:

class Example
  make_dup :name, :value
  attr_accessor :name, :value

  def initialize(name,value)
    @name, @value = name, value
  end
end

我想要它来创建方法:

def dup
  Example.new(name,value)
end

我只是想知道如何在那里插入Example

3 个答案:

答案 0 :(得分:1)

请注意,所有类都有内置的dupclone方法。您可以通过添加initialize_copy方法来自定义其中发生的事情,例如:

class Foo
  attr_accessor :bar
  def initialize_copy(orig)
    super
    @bar = @bar.dup
  end
end

如果这不是您真正想要的,您可以使用其类方法访问对象的类:

class Foo
  def p_class
    p self.class      # Foo.new.p_class => Foo     ; self is *a* `Foo'
  end

  def self.p_class
    p self.class      # Foo.p_class     => Class   ; self *is* `Foo'
  end
end

答案 1 :(得分:0)

def dup
  self.class.new(name,value)
end

答案 2 :(得分:0)

也许你可以这样实现它:

module MyDup
  def make_dup(*args)
    define_method(:my_dup) do
      obj = self.class.new(nil, nil)
      args.each do |arg|
        obj.send(arg.to_s + "=", self.send(arg))
      end
      obj
    end
  end
end

class Example
  extend MyDup
  make_dup :name, :value
  attr_accessor :name, :value

  def initialize(name,value)
    @name, @value = name, value
  end
end

e = Example.new("John", 30)
p e

d = e.my_dup
p d

执行结果如下:

#<Example:0x000000022325d8 @name="John", @value=30>
#<Example:0x00000002232358 @name="John", @value=30>