我可以针对Ruby中的绑定对象计算块吗?

我可以针对Ruby中的绑定对象计算块吗?,ruby,exception-handling,Ruby,Exception Handling,我试图将引发异常的上下文传递给异常子类,以便使用此上下文生成信息性错误消息。我知道我可以将单个数据片段传递给异常,但我想知道如何传递和使用整个上下文 我知道我可以通过Kernel#binding捕获上下文。类绑定的Ruby 2.0文档列出了一个方法:eval。这允许您在绑定捕获的上下文中计算字符串。我想知道是否有可能在绑定上下文中计算块。我将使用以下方法: class MyError < StandardError def initialize(str: nil, context:

我试图将引发异常的上下文传递给
异常
子类,以便使用此上下文生成信息性错误消息。我知道我可以将单个数据片段传递给异常,但我想知道如何传递和使用整个上下文

我知道我可以通过
Kernel#binding
捕获上下文。类
绑定的Ruby 2.0文档列出了一个方法:
eval
。这允许您在
绑定捕获的上下文中计算
字符串
。我想知道是否有可能在绑定上下文中计算块。我将使用以下方法:

class MyError < StandardError

  def initialize(str: nil, context: nil)
    @str = str; @context = context
    super(str)
  end

  def to_s
    @str ? @str : @context.**SOME_METHOD** { "Error: x == #{x}" }
  end

end 

x = 5
raise MyError.new(context: binding)

=> Error: x == #{5}
class MyError错误:x={5}
我尝试了
instance\u exec
instance\u eval
,都是为了一些方法,两者都不起作用。有没有办法做到这一点?或者,是否有某种原因导致从整个上下文而不是从环境中的单个数据段生成错误消息是个坏主意?

使用
eval(string,binding)
使用给定的变量绑定运行Ruby代码。对于您的情况,您可以将
重写为_s
方法,如下所示:

def to_s
@str@str:eval(''Error:x=={x}',@context)
结束
请注意,在将参数传递给
eval
之前,需要使用
“some_string”
表单来防止字符串插值

如果要使用一些绑定计算块,则必须将块分配给一个变量并
eval
block.call一样计算块。现在有两个绑定环境,一个用于变量
,另一个用于块中的变量。由于对于
绑定
,没有像
join
combine
这样的方法,因此使用
内核#eval
绑定#eval
似乎无法实现这一点。此外,块捕获其定义的绑定。当您调用
eval('block.call',某些绑定)
时,它会忽略传入的绑定

但是,您可以使用
Object#instance _eval
并以
instance _eval(&block)
的形式传递块,这将在类实例方法的绑定中计算块。因此,您可以使用捕获的上下文为块创建适当的绑定

class BlockEnv
def初始化(上下文和块)
#删除从对象继承的实例方法以最小化影响
#如果不需要,请删除此项
BlockEnv.instance_方法
.拒绝{m|
[:object\u id,:call,:instance\u eval,:method\u缺少]。包括?(m)||
m、 到_s!~/^[a-z]\w*$/i}
.每个都有| m|
评估(“未定义:{m}”)
结束
@上下文=上下文
@块=块
结束
def呼叫
self.instance_eval(&@block)
结束
def方法_缺失(名称)
eval(name.to_s,@context)救援超级
结束
结束
类MyError<标准错误
def初始化(str:nil,context:nil)
@str=str@上下文=上下文
超级(str)
结束
def至美国
@str@str:BlockEnv.new(@context){“Error:x==#{x}}.call
结束
结束
x=5
raise MyError.new(上下文:绑定)

非常酷,我会用这个。这对我来说很奇怪,虽然没有更直接的方法来做到这一点。