Ruby 通过访问传入块的上下文来计算代码

Ruby 通过访问传入块的上下文来计算代码,ruby,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 acce

我希望能够做到以下几点:

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

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

有一种非常复杂的方法,这种方法很有情境性,但在这种狭隘的情况下是有效的:

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

块上的允许您访问碰巧定义的任何/所有局部变量。

如果有任何方法的话,没有非黑客方法可以做到这一点。您试图访问一个您绝对无法访问的变量。@meagar我相信您已经明白我的意思了。我一直在寻找一些干净的方法来实现这样的目标,而不需要修改/传递绑定等等。我没有找到它,但我很确定我错过了一些简单的东西。最大的目标是能够将其他方法包装到rescuer中,并在那里处理异常。一个想法是将
parameter
作为一个实例变量,但我想要更智能的东西。是的,我知道我无法访问该变量:)尽管它丑陋而混乱,传递绑定将是最干净的方法。正如你所知道的,局部变量意味着是局部的,试图访问它们违背了“标准”,而且会很难看。丑陋的代码在Ruby中应该看起来丑陋。除非这是针对某个极端的边缘案例,否则我个人会重新思考我正在做的事情的结构,并以不同的方式去做。@ForeverZer0当然,99%的时间里必须变得“丑陋”,这意味着需要重新思考方法。在这种情况下,我只是想知道我是否错过了任何简单的工作purpose@AndreyDeineko不幸的是,我不认为你错过了我所知道的任何事情。使用绑定是我知道的最好的方法。也许可以用Trace破解一些东西,但这只会更难看。谢谢@tadman,知道这个。我意识到这不值得(当你不得不破解时,这几乎永远不值得)。我用了一种干净的方法——将参数传递给
rescuer