【发布时间】:2015-05-02 03:45:59
【问题描述】:
我目前正在开发一个接口,该接口允许我使用 proc 链包装任意方法调用。无需过多详细说明,我目前有一个接受如下内容的接口:
class Spy
def initialize
@procs = []
end
def wrap(&block)
@procs << block
end
def execute
original_proc = Proc.new { call_original }
@procs.reduce(original_proc) do |memo, p|
Proc.new { p.call &memo }
end.call
end
def call_original
puts 'in the middle'
end
end
spy = Spy.new
spy.wrap do |&block|
puts 'hello'
block.call
end
spy.wrap do |&block|
block.call
puts 'goodbye'
end
spy.execute
我想做的是从我的 API 中删除 |&block| 和 block.call 并改用 yield。
spy.wrap do
puts 'hello'
yield
end
这不起作用并引发了LocalJumpError: no block given (yield) 错误。
我也尝试通过在 reduce 中传递 define_singleton_method 来创建方法,但我没有任何运气。
def execute
original_proc = Proc.new { call_original }
@procs.reduce(original_proc) do |memo, p|
define_singleton_method :hello, &p
Proc.new { singleton_method(:hello).call(&memo) }
end.call
end
我可以使用其他方法吗?无论如何从 Proc 到 yield 或使用 Proc 来初始化可以屈服的东西?
【问题讨论】:
标签: ruby