3

呼び出されたブロック内で呼び出されたオブジェクトを取得する方法はありますか。たとえば、ブロックがメソッド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)
4

2 に答える 2

2

たとえば、Savon gemで使用されるInstance eval with delegation pattern に似たものを使用できます。

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のコンテキストで呼び出されます。SuperHerosそのようなメソッドが利用できない場合、呼び出しはmethod_missing元のブロックに (経由して)進みますself

于 2013-11-07T11:10:23.047 に答える