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

Ruby 将方法从一个类复制到另一个类,ruby,metaprogramming,proc,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.cl

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

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
为什么我需要这个?我正在研究gem,它使用一个只有三个方法的类。初始化时(将隐藏在父类中),它将把这个方法传递给不同的类。我可以用块来做这个,但是用方法它就没有那么干净了

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


PSS:或。。。如何将方法转换为proc,这样我就可以将它传递到
class\u eval

要将一个方法转换为可以像proc一样调用的东西,请使用
obj.method(:method\u name)
。这将为您提供一个绑定方法对象,当
调用
ed时,将在
obj
上调用该对象。如果要在同一类的不同对象上调用它,可以调用
method.unbind.bind(different_obj)

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


或者,您可以让用户传递一个模块,并使您自己的类
包含
扩展
该模块(根据需要)。

可以将方法从一个类复制到另一个类,但有一个主要的警告:目标类必须是一种?源类或源必须是模块。此限制部分记录在的文档中,但要查看模块异常,必须查看该方法的源代码。包含有关此主题的更多讨论

以下是一个例子:

module A
  def say_hello
    puts "Hello"
  end
end

class B
  define_method(:say_hello, A.instance_method(:say_hello))
end

b = B.new
b.say_hello
=> Hello
如果
A
是一个类,而
B
是从
A
继承的类,那么这也会起作用。但在这种情况下,您可能已经通过继承获得了该方法,因此我个人认为它没有什么用处

我发现这种模式很有用的一种情况是,当使用继承自
BasicObject
的对象设计DSL时。由于
BasicObject
不像
Object
那样包含内核
,因此您无法轻松访问许多有用的方法,例如
#实例(变量
,甚至
#类
。但您可以将它们分别从内核复制到类中:

class Foo < BasicObject
  define_method(:class, ::Kernel.instance_method(:class))
end

f = Foo.new
puts f.class
=> Foo
class FooFoo

也许您必须使用委派?你就不能包括一个模块吗?@Fivell,也许吧!我现在需要阅读有关授权的内容,添加了与examples@SergioTulentsev在本例中-noI相信我会使用reference:),但现在我感兴趣的是我是否可以在Ruby中的类之间复制方法!我不认为有,但如果你找到一个方法,请张贴它。我也想知道。我相信元编程可以做任何事情:)谢谢你的回答