通过访问传入块的上下文来评估代码

时间:2018-07-06 11:39:26

标签: ruby

我希望能够做这样的事情:

def do_stuff(parameter)
  raise StandardError
end

def foo(parameter)
  rescuer { do_stuff(parameter) }
end

def rescuer
  begin
    yield # evaluate passed block
  rescue StandardError
    puts parameter # evaluate this with having access to `parameter` from block
  end
end

foo('bar')
#=> bar

实现这一目标的最简单的方法是什么?

1 个答案:

答案 0 :(得分:1)

有一种杂乱的方式来执行此操作,这种方式非常有针对性,但这在狭窄的情况下有效:

def rescuer(&block)
  begin
    yield
  rescue StandardError
    p block.binding.local_variable_get(:parameter)
  end
end

块上的binding使您可以访问碰巧已定义的任何/所有局部变量。