声明一个变量local

时间:2013-12-18 03:23:27

标签: ruby

在Ruby中,当您创建新范围时,如果变量在外部范围中已存在,则会在第一次分配时捕获该变量,或者将在本地创建该变量。如何防止变量被捕获?

2 个答案:

答案 0 :(得分:1)

Ruby中有不同类型的局部作用域:脚本体,类体,模块体,方法体,lambda文字和块体。无论如何,脚本,类,模块和方法范围都不会嵌套,因此您无需执行任何操作。

只有block和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 }

答案 1 :(得分:0)

你可以把它放在一个方法中,它们没有词法范围:

x = 2

def foobar
  x = 123
end

foobar  #=> 123
x       #=> 2

然而,目前尚不清楚你的目标是什么。如果您更清楚地描述您的实际问题,我们可能会提出更好的答案。