将方法从一个类复制到另一个类

fl0*_*00r 4 ruby metaprogramming proc

我想用一些方法编写小类,它们实际上属于其他类,所以如何在其他类中定义现有副本的方法.我相信这是我不明白的元编程魔法师.

class Foo
  def initialize
    # with blocks, I would just pass block, but this is methods
    # so this won't work
    Bar.class_eval(perform)
    Bar.class_eval(process)
    Bar.class_eval(save)
  end

  def perform
    1+1
  end

  def process
    # some code
  end

  def save
    # some code
  end
end

class Bar; end

foo = Foo.new
foo.perform
#=> 2
Bar.test
#=> 1
Run Code Online (Sandbox Code Playgroud)

为什么我需要这个?我正在研究gem,它只需要三个方法.在初始化时(可能隐藏在父类中),它会将此方法传递给不同的类.我可以使用块来制作它,但是使用方法它会更清洁.

PS:这就像从一个类复制方法到另一个类

PSS:或者...如何将方法转换为proc,所以我可以将它传递给class_eval

Ale*_*x D 14

要将方法转换为可以像Proc一样调用的方法,请使用obj.method(:method_name).这将为您提供一个绑定的 Method对象,该对象在call编辑时将被调用obj.如果要在同一个类的不同对象上调用它,可以调用method.unbind.bind(different_obj).

这仍然不允许您将方法从一个类"复制"到另一个类.如果您希望允许用户传递一个定义3个方法的类,而不是传递3个块,那么如果在内部存储对该类(或其实例)的引用,并根据需要调用其上的方法,它可能会更好.那就是评论"代表团"的人的意思.

或者,您可以让用户传递一个Module,然后创建自己的类includeextend模块(根据需要).