变量赋值发生在块中的块中

时间:2016-07-13 22:16:11

标签: ruby yield ruby-block

我第一次使用此代码,但它无法正常工作:

VIM = Vimrunner::RSpec.configure do |config|
  config.reuse_server = true

  config.start_vim do
    vim = Vimrunner.start
    vim
  end
end

configure只是一种为Vimrunner服务器进行设置的方法。 start_vim方法只是描述了启动vim应该执行的操作。然而,这并不重要。

实际上正确的是:

Vimrunner::RSpec.configure do |config|
  config.reuse_server = true

  config.start_vim do
    VIM = Vimrunner.start
    VIM
  end
end

我不太明白这一点。在第一种情况下,我实际上将Proc分配给VIM常量,正如我在irb中找到的那样,而在第二种情况下,VIM常量被正确分配。

所以看来,我通过使用这些块分配了VIM常量(位于全局命名空间中),而我的理解使我无法理解:

如何在块中的块中分配变量并将该赋值投掷返回到全局命名空间?

How does that work?例如,我尝试了这段代码:

def foo
    yield
end

foo do
    a = 'Hello World!'
    a
end

puts a

哪个会显示错误。如何将ruby块中的变量放入调用者的范围?

1 个答案:

答案 0 :(得分:1)

如果要在外部访问它,可以使用实例变量吗?即@a = 'Hello World!'然后使用puts @a。局部变量与您自己的块相关联,因此无法在外部调用。

我不确定您的用例是什么,但是您应该可以使用它

def foo
  yield
end

foo { 'Hello World!' }

或在你的第一种情况下(因为它是一个配置设置我不确定如果你需要一个变量存储它,它是否重要)

Vimrunner::RSpec.configure do |config|
  config.reuse_server = true
  config.start_vim { Vimrunner.start }
  config
end