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