Hi all, 希望实现这样一个功能,就像 Rack Middleware 一样,通过注册的方法层层深入知道 endpoint 为止。但是和 Rack Middleware 的区别是
@app.call
这样并不优雅的方法我现在写了这些代码:
def filter(name, &blk)
@__filters ||= []
@__filters << [name, blk]
end
def run_filters(&blk)
m = Module.new do
extend self
@__filter_endpoint = blk
end
code = '@__filter_endpoint.call'
@__filters.each do |name, block|
m.send(:define_method, :"__filter_#{name}", &block)
end
@__filters.each do |name, block|
code = "send(:\"__filter_#{name}\") { #{code} } "
end
m.module_eval code.tap {|c| puts c}
end
filter '1' do
puts 1
yield
puts 1
end
filter '2' do
puts 2
yield
puts 2
end
filter '3' do
puts 3
yield
puts 3
end
run_filters do
puts 'core'
end
可以看到输出信息中已经有send(:"__filter_3") { send(:"__filter_2") { send(:"__filter_1") { @__filter_endpoint.call } } }
,可见去 eval 的代码是正确的。
并且还输出了一个 3,表示已经确实执行了__filter_3 方法,但是跑到 yield 的时候出现了错误:no block given
请教大家,如何解决这个问题,谢谢。