2016-07-13 10 views
0

ich diesen Code zuerst hatte, aber es funktioniert nicht:Variable Zuordnung erfolgt in einem Block in einem Block

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

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

Die configure ist nur eine Methode, die die Einstellungen für einen Vimrunner Server tut. Die start_vim Methode zeigt nur, was ausgeführt werden soll, um vim zu starten. Das ist aber nicht wirklich wichtig.

Was war eigentlich richtig war:

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

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

ich das nicht ganz verstehen. Im ersten Fall habe ich der VIM Konstante einen Proc zugewiesen, wie ich durch irb herausgefunden habe, während im zweiten Fall die VIM Konstante korrekt zugewiesen wurde.

So scheint es, ich habe die VIM Konstante zugewiesen (die im globalen Namensraum liegt) durch die Verwendung dieser Blöcke, und das ist, wo mein Verständnis mir versagt:

Wie ich kann ich eine Variable in einem Block zuweisen in einem Block und lassen Sie diese Zuordnung zurückgeschleudert zurück zum globalen Namespace?

How does that work? Zum Beispiel habe ich diesen Code versucht:

def foo 
    yield 
end 

foo do 
    a = 'Hello World!' 
    a 
end 

puts a 

Welche wird mir einen Fehler zeigen. Wie kann ich Variablen in Ruby Blocks in den Bereich des Aufrufers legen?

Antwort

1

Sie könnten eine Instanzvariable verwenden, wenn Sie außerhalb darauf zugreifen möchten? d.h. @a = 'Hello World!' und dann puts @a verwenden. Lokale Variablen sind an den Block gebunden, den Sie selbst haben, und können daher nicht außerhalb aufgerufen werden.

Ich bin mir nicht sicher, was genau Ihr Anwendungsfall ist jedoch sollten Sie in der Lage sein, dies zu verwenden, anstatt

def foo 
    yield 
end 

foo { 'Hello World!' } 

oder in Ihrem ersten Fall (da es eine Konfiguration, die ich bin mir nicht sicher, ob es Einstellung ist sogar wichtig, wenn Sie eine Variable benötigen, um dies zu speichern)

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

Eigentlich nein, das funktioniert nicht. Es muss 'config.start_vim {vim = Vimrunner.start; vim} '. Das ist es, was ich daran so verwirrend finde. – hgiesel

+0

Das scheint seltsam, denn es ist ziemlich das Gleiche. –

+0

@hgiesel, könnten Sie versuchen, den aktualisierten Code (letzte) –