2010-11-19 5 views
25

Ich habe eine Frage zu Block, bedeuten die beiden Codes das Gleiche? 1File.open mit Block vs ohne

Code

File::open('yozloy.txt','w') do |f| 
    f << 'Some contains' 
end 

Code 2

newFile = File::open('yozloy.txt','w') 
newFile << 'Some contains' 
+1

Ich glaube nicht, dass es so wichtig ist, aber es ist weit üblicher, Klassenmethoden als 'File.open' statt als' File :: open' zu schreiben. – Telemachus

+0

'code 2' wird die Datei nicht automatisch schließen, wie' code 1' dies tut. Sie müssen also 'newFile.close' eingeben. –

Antwort

25

DarkDust sagte bereits, dass diese Methoden unterschiedlich sind. Ich erkläre dir die Blöcke ein wenig mehr, da ich vermute, dass du diese Frage stellst ;-)

Der Block in Ruby ist nur ein Parameter für irgendeine Methode. Es ist nicht nur eine andere Syntax.

Methoden, die (optionale) Blöcke akzeptieren, müssen normalerweise prüfen, ob sie mit oder ohne Block aufgerufen wurden.

dieses sehr vereinfachtes Beispiel vor: (der wirkliche File.open ist ähnlich, aber es sorgt für die Datei auch geschlossen, wenn Ihr Block einen Fehler auslöst, zum Beispiel)

def open(fname) 
    self.do_open(fname) 
    if block_given? 
    yield(self) # This will 'run' the block with given parameter 
    self.close 
    else 
    return self # This will just return some value 
    end 
end 

Im Allgemeinen jede Methode kann arbeitet (arbeitet) anders mit einem Block oder ohne Block. Es sollte immer in der Methodendokumentation angegeben werden.

+0

ausgezeichnete Erklärung – mko

+0

Ich bin neu in Ruby und ich kann Ihren Code nicht ausführen. Ich habe versucht "file = open (file_name)", aber ich bekomme undefinierte Methode 'do_open 'für main: Object (NoMethodError). Woher kommt diese do_open-Methode? – Robert3452

33

Nein, sie bedeuten nicht das gleiche. Im ersten Beispiel wird die Datei automatisch geschlossen, nachdem der Block verarbeitet wurde. Im zweiten Beispiel liegt es in Ihrer Verantwortung, newFile.close manuell aufzurufen.

Verwandte Themen