Я хочу захватить блоки (со связанным именем), но без каких-либо изменений в области, в которой они написаны.Код ниже имеет два способа захвата блока (capt_a
и capt_b
).capt_a
работает нормально, и я бы хотел, чтобы capt_b
работал так же.Можно ли изменить capt_b
так, чтобы эффект был таким же, как capt_a
?
class Capturer
attr_reader :method, :block
def capt_a
yield self
self
end
def capt_b(&block)
instance_eval(&block)
self
end
def method_missing(method, &block)
@method = method
@block = block
end
end
# Example:
a = Capturer.new.capt_a{|capt| capt.foo{self} }.block
b = Capturer.new.capt_b{ foo{self} }.block
a.call # => main
b.call # => #<Capturer:0x000001008fb5c8 @method=:foo, @block=#<Proc:0x000001008fb500@temp.rb:23>>
# I would like 'main'