Я пытаюсь написать класс, который поддерживает вложенные фильтры, не представляя Aspect-ориентированную библиотеку.
class Foo
attr_accessor :around_filter
def initialize
#filters which wrap the following one are the ones with interesting logic
#vanilla do-nothing filter
@around_filter = lambda { yield } # or lambda {|&blk| blk.call}
end
def bar
#would execute the around filters however deeply nested, then "meaty code"
@around_filter.call do
#meaty code here
puts 'done'
end
end
#I expected to point only to the topmost filter, hoping to recurse
def add_around_filter(&blk)
prior_around_filter = @around_filter
@around_filter = #??mystery code here?? refers to prior_around_filter
end
end
Цель состоит в том, чтобы иметь возможность добавлять любое количество обходных фильтров:
foo = Foo.new
foo.add_around_filter do
puts 'strawberry'
yield
puts 'blueberry'
end
foo.add_around_filter do
puts 'orange'
yield
puts 'grape'
end
foo.bar #=> orange, strawberry, done, blueberry, grape
Я знаю, что в примере есть куча дыр.Я написал только достаточно, чтобы составить общее направление, выделив его из гораздо большего фактического класса.
Хотя я предпочитаю синтаксис yield
, я не против блоковых ссылок:
foo.add_around_filter do |&blk|
puts 'orange'
blk.call
puts 'grape'
end
Я получил это работает только с одним фильтром вокруг.Я много чего перепробовал с вложением, но так и не разгадал загадку.Если у вас есть решение, я буду признателен за это!