2016-07-13 14 views
0

я первый имел этот код, но он не работает:Присваивание происходит в блоке, в блоке

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

Вы можете использовать переменную экземпляра, если хотите получить к ней доступ за пределами? то есть @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 
+0

Фактически нет, это не работает. Он должен 'config.start_vim {vim = Vimrunner.start; vim} '. Вот что я так смущаю. – hgiesel

+0

Это кажется странным, поскольку это почти то же самое. –

+0

@hgiesel, не могли бы вы попробовать обновленный код (последний) –