42 irb(main):002:-6ren">
gpt4 book ai didi

ruby - 在不创建 block 作用域的情况下运行 eval

转载 作者:数据小太阳 更新时间:2023-10-29 07:55:30 25 4
gpt4 key购买 nike

我正在尝试理解 Ruby 中的 eval 和绑定(bind)上下文。

在 irb 中考虑以下内容

irb(main):001:0> eval "a = 42"
=> 42
irb(main):002:0> a
NameError: undefined local variable or method `a' for main:Object
from (irb):2
from /Users/niels/.rbenv/versions/2.1.3/bin/irb:11:in `<main>'
irb(main):003:0>

为什么a没有定义?

如果我在评估之前声明a,则值 42 会分配给 a

在我看来,某种 block 作用域适用于局部变量在 eval 上下文中可用的情况,但声明的任何变量仅在 block 作用域中声明。

如何在不创建新范围的情况下评估代码?

最佳答案

Why is a not defined?

a 在 eval 代码的绑定(bind)内定义,但不在其外部。这就是局部变量的工作原理。它们在定义它们的范围内是局部的。毕竟这就是它们被称为“局部”变量的原因。

If I declare a prior to evalling, the value 42 is assigned to a.

是的,eval 的作用域是嵌套的,就像 block 作用域一样。

How do I eval code without creating a new scope?

你不能。在 Ruby 1.8 及之前的版本中,eval 确实会将变量泄漏到周围的作用域中,但该泄漏在 1.9 及更高版本中已得到修复。

关于ruby - 在不创建 block 作用域的情况下运行 eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31441319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com