有没有办法在被调用的 block 中获取被调用的对象。例如, block 是否有任何方法可以访问方法 batman
或类 SuperHeros
class SuperHeros
attr_accessor :news
def initialize
@news = []
end
def batman task
puts "Batman: #{task} - done"
yield "feed cat"
@news << task
end
end
cat_woman = lambda do |task|
puts "Cat Woman: #{task} - done"
# invoker.news << task
end
robin = lambda do |task|
puts "Robin: #{task} - done"
# invoker.news << task
end
characters = SuperHeros.new
characters.batman("kick Joker's ass", &cat_woman)
characters.batman("break Bane's bones", &robin)
最佳答案
您可以使用类似于 Instance eval with delegation 的内容图案,用于 - 例如 - 在 Savon 中 gem :
def batman(task, &block)
@original_self = eval('self', block.binding)
puts "Batman: #{task} - done"
instance_exec('feed cat', &block)
@news << task
end
private
def method_missing(method, *args, &block)
if @original_self
@original_self.send(method, *args, &block)
else
super
end
end
在这种方法中,当您在传递给 batman
方法的 block 内调用方法(使用隐式接收器)时,它会在 SuperHeros
实例的上下文中调用。如果没有这样的方法可用,则调用(通过 method_missing
)到原始 block self
。
关于ruby - 在 Ruby 中引用传递的 block 中的调用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19834086/