将var值传递给ruby上的闭包

将var值传递给ruby上的闭包,ruby,closures,vagrant,Ruby,Closures,Vagrant,我有一个包含以下代码片段的文件: for j in 1..3 config.vm.define "zookeeper#{j}" do |s| puts j end puts "#{j}" end 我的目标是在每次迭代时根据j的值设置IP,但当Vagrant创建虚拟机时,该值始终为3(for迭代的最后一个值) 这将打印以下内容: 1 2 3 3 <-- should start with 1 3 3 1 2. 3. 3问题基本上与以下方面有关:

我有一个包含以下代码片段的文件:

  for j in 1..3
    config.vm.define "zookeeper#{j}" do |s|
      puts j
    end
    puts "#{j}"
  end
我的目标是在每次迭代时根据
j
的值设置IP,但当Vagrant创建虚拟机时,该值始终为3(for迭代的最后一个值)

这将打印以下内容:

1
2
3
3 <-- should start with 1
3
3
1
2.
3.
3问题基本上与以下方面有关:

for循环获取自己的执行上下文,该上下文以副本开始 当前执行上下文的,但它没有自己的 局部变量绑定

我已将for更改为each,现在它可以工作了:

(1..3).each do |j|
    config.vm.define "zookeeper#{j}" do |s|
      puts j
    end
  end

您希望像123123一样运行for循环多少次。。所以呢?不,只有3次迭代可能在代码中的某个地方,你正在将其重置为3…需要更多的上下文我想不,正如你所看到的,我只是在打印它,我怀疑内部put引用的是
j
,而不是值,这就是为什么没有人使用它们的原因。这是我第一次接触Ruby,我感到惊讶的是,人们似乎不使用
来处理
,而且它有这样的小故障,这不是小故障。它与Ruby中的所有其他控制结构都是一致的。只有脚本主体、方法主体、类主体、模块主体、lambda文本主体和块主体才能创建新的词汇作用域<代码>对于
循环,
循环,
直到
循环,
如果
表达式,
除非
表达式,
开始
块,
大小写
表达式不执行。