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,然后创建自己的类include或extend模块(根据需要).
| 归档时间: |
|
| 查看次数: |
2893 次 |
| 最近记录: |