在Ruby中,当你创建一个新的作用域时,如果一个变量已经存在于外部作用域中,那么它将在第一次赋值时被捕获,或者它将被本地创建。如何防止变量被捕获?
发布于 2013-12-18 19:13:15
Ruby中有不同种类的局部作用域:脚本体、类体、模块体、方法体、lambda字面量和块体。脚本、类、模块和方法作用域无论如何都不嵌套,因此您不需要做任何事情。
只有块和lambda字面量可以嵌套,您可以通过将变量附加到以分号分隔的参数列表来显式地将变量声明为本地变量:
x, y, z = %i[x y z]
-> (m1, m2, o1=:o1, o2=:o2, *splat, m3, m4,
ok1: :ok1, mk1:, mk2:, ok2: :ok2, **ksplat, &blk; x, y) {
Hash[local_variables.map {|var| [var, eval(var.to_s)] }]
}.(1, 2, 3, 4, mk1: 5, mk2: 6)
# => { x: nil, y: nil, z: :z, m1: 1, m2: 2, o1: :o1, o2: :o2, splat: [],
# m3: 3, m4: 4, ok1: :ok1, mk1: 5, mk2: 6, ok2: :ok2, ksplat: {},
# blk: nil }发布于 2013-12-18 16:19:18
你可以把它放在一个方法中,它们没有词法作用域:
x = 2
def foobar
x = 123
end
foobar #=> 123
x #=> 2然而,目前还不清楚你的目标是什么。如果你更清楚地描述你的实际问题,我们可能会想出更好的答案。
https://stackoverflow.com/questions/20649123
复制相似问题