我有这个代码:
l = lambda { a }
def some_function
a = 1
end
我只想a
通过 lambda 和一个特殊范围访问,该范围a
已经在示例内部的某个地方定义some_function
,或者稍后在与以下相同的范围内定义:
l = lambda { a }
a = 1
l.call
然后我发现在调用时l
,它仍然使用自己的绑定,而不是调用它的新绑定。
然后我尝试将其用作:
l.instance_eval do
a = 1
call
end
但这也失败了,奇怪的是我无法解释为什么。
我知道解决方案之一是 using eval
,我可以在其中特殊绑定并在文本中执行一些代码,但我真的不想这样使用。
而且,我知道它能够使用全局变量或实例变量。但是,实际上我的代码处于更深层次的嵌入式环境中,所以如果不是很有必要,我不想破坏已完成的部分。
我Proc
在文档中引用了该类,并且找到了一个binding
引用Proc
' 上下文的函数名称。虽然该函数仅提供了一种访问其绑定但不能更改它的方法,但使用Binding#eval
. 它也评估文本,这正是我不喜欢做的。
现在的问题是,我有更好(或更优雅)的方式来实现它吗?还是使用eval
已经是常规方式?
编辑回复@Andrew:
好的,这是我在编写词法解析器时遇到的一个问题,我在其中定义了一个具有固定数量项目的数组,其中至少包括一个Proc
和一个正则表达式。我的目的是匹配正则表达式并在我的特殊范围内执行 Procs,其中 Proce 将涉及一些稍后应该定义的局部变量。然后我遇到了上面的问题。实际上,我认为这个问题
并不完全一样,因为我的问题是如何将绑定传递给 Proc 而不是如何将其传递出去。
@Niklas:得到你的答案,我想这正是我想要的。它完美地解决了我的问题。