ruby - 在 Ruby 中引用传递的 block 中的调用对象

标签 ruby lambda block proc

有没有办法在被调用的 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/

相关文章:

javascript - 通过 Google App Script 调用 AWS Lambda 函数

mysql - Ruby on Rails 3 中的安装错误

ruby-on-rails - Rails POST、PUT、GET

c# - 如何筛选具有日期的列表并仅检索 7 天内的数据

python - 在以下表达式中使用 lambda

iOS 在 block 中返回 bool 值

jQuery 查找 block 元素的宽度

c# - 在 c# 2.0 中阻止/重定向 IP 或没有主机文件的主机

ruby - zsh : command not found: bundle (after gem install bundle)

ruby - 如何在 Ruby 中将数字四舍五入到最接近的 9