【发布时间】:2012-04-07 22:49:45
【问题描述】:
我有这个代码:
l = lambda { a }
def some_function
a = 1
end
我只想通过 lambda 访问 a 和一个特殊范围,该范围已经在示例中的 some_function 内部的某个地方定义了 a,或者稍后在与以下相同的范围内:
l = lambda { a }
a = 1
l.call
然后我在调用l时发现,它仍然使用自己的绑定,而不是调用它的新绑定。
然后我尝试将其用作:
l.instance_eval do
a = 1
call
end
但这也失败了,奇怪的是我无法解释为什么。
我知道解决方案之一是使用eval,我可以在其中特殊绑定并执行一些文本代码,但我真的不想这样使用。
而且,我知道它可以使用全局变量或实例变量。但是,实际上我的代码处于更深的嵌入式环境中,所以如果不是很有必要,我不想破坏已完成的部分。
我在文档中引用了Proc 类,并且我找到了引用Proc 上下文的函数名称binding。虽然该函数仅提供了一种访问其绑定但不能更改它的方法,但使用 Binding#eval 除外。它还评估文本,这正是我不喜欢做的。
现在的问题是,我有更好(或更优雅)的方式来实现它吗?还是使用eval已经是常规方式了?
编辑回复@Andrew:
好的,这是我在编写词法解析器时遇到的一个问题,我在其中定义了一个具有固定数量项目的数组,其中至少包括一个 Proc 和一个正则表达式。我的目的是匹配正则表达式并在我的特殊范围内执行 Procs,其中 Proce 将涉及一些稍后应定义的局部变量。然后我遇到了上面的问题。
实际上我认为它与that question 不完全一样,因为我的是如何将 in 绑定传递给 Proc,而不是如何将其传递 out。
@尼克拉斯: 得到你的答案,我想这正是我想要的。完美解决了我的问题。
【问题讨论】:
-
也许一个很好的问题是为什么你想这样做,或者更确切地说,你想要最终实现什么?
-
@Andrew:我不知道。我对这个确切问题的答案感兴趣,而不是对潜在问题的解决方案:)
-
@NiklasB。我同意,但了解最终目标有助于更好地理解问题。而且我很确定我不久前回答了类似的问题,我正在尝试找到它但找不到
:(。 -
@Andrew:我对此非常感兴趣!碰巧,我今天遇到了一个与动态绑定非常相似的问题。
-
@NiklasB。啊,这似乎与此相反:尝试在块中定义的方法中使用变量。 "Is it possible to access block's scope in method?"(哦,看看第一条评论你知道什么……似曾相识!)
标签: ruby