In den meisten Programmiersprachen ist allgemein bekannt, dass der Ablauf für die Arbeit mit Dateien Open-Use-Close ist. Dennoch habe ich viele Male in Ruby-Codes unübertroffene File.open-Aufrufe gesehen, und außerdem habe ich dieses Juwel des Wissens in den Ruby-Dokumenten gefunden:
E / A-Streams werden automatisch geschlossen, wenn sie vom Garbage Collector beansprucht werden.
darkredandyellow freundliche irc nehmen das Problem auf:
[17:12] Ja, und außerdem ist die Anzahl der Dateideskriptoren normalerweise durch das Betriebssystem begrenzt.
[17:29] Ich gehe davon aus, dass Ihnen die verfügbaren Dateideskriptoren leicht ausgehen können, bevor der Garbage Collector bereinigt wird oben. In diesem Fall möchten Sie sie möglicherweise selbst schließen. "behauptet vom Müllsammler." bedeutet, dass der GC irgendwann in der Zukunft handelt. und es ist teuer. viele Gründe für das explizite Schließen von Dateien.
- Müssen wir explizit schließen?
- Wenn ja, warum schließt der GC dann automatisch?
- Wenn nicht, warum dann die Option?
$ ulimit -n => 1024
es nur dann hoch, wenn Sie nur einen einfachen Job machen. Schlechte Angewohnheit wird eines Tages ein großes Problem verursachen!Antworten:
Kannst du ein Beispiel geben? Ich sehe immer nur, dass in Code, der von Neulingen geschrieben wurde, denen das "allgemeine Wissen in den meisten Programmiersprachen fehlt, dass der Fluss für die Arbeit mit Dateien offen ist, geschlossen ist".
Erfahrene Rubyisten schließen entweder explizit ihre Dateien oder verwenden idiomatischer die Blockform von
File.open
, mit der die Datei automatisch für Sie geschlossen wird. Die Implementierung sieht im Grunde ungefähr so aus:Skripte sind ein Sonderfall. Skripte werden im Allgemeinen so kurz ausgeführt und verwenden so wenige Dateideskriptoren, dass es einfach nicht sinnvoll ist, sie zu schließen, da das Betriebssystem sie ohnehin schließt, wenn das Skript beendet wird.
Ja.
Denn nachdem das Objekt erfasst wurde, können Sie die Datei nicht mehr schließen, sodass Sie Dateideskriptoren verlieren.
Beachten Sie, dass es nicht der Garbage Collector ist, der die Dateien schließt. Der Garbage Collector führt einfach alle Finalizer für ein Objekt aus, bevor er es sammelt. Es ist einfach so, dass die
File
Klasse einen Finalizer definiert, der die Datei schließt.Weil verschwendeter Speicher billig ist, verschwendete Dateideskriptoren jedoch nicht. Daher ist es nicht sinnvoll, die Lebensdauer eines Dateideskriptors an die Lebensdauer eines Speicherbereichs zu binden.
Sie können einfach nicht vorhersagen, wann der Garbage Collector ausgeführt wird. Sie können nicht einmal vorhersagen, ob es überhaupt ausgeführt wird : Wenn Ihnen nie der Speicher ausgeht, wird der Garbage Collector niemals ausgeführt, daher wird der Finalizer niemals ausgeführt, daher wird die Datei niemals geschlossen.
quelle
ensure
,rescue
undraise
ist überhaupt nicht notwendig.ensure
ohne habenrescue
. Und Sie können die Ausnahme nicht einfach stillschweigend verschlucken, sondern müssen sie an den Anrufer weitergeben, nachdem Sie die Datei geschlossen haben. Wie auch immer, erinnern Sie mich noch einmal im Mai '15 :-DSie sollten Dateideskriptoren nach der Verwendung immer schließen, damit sie auch gelöscht werden. Häufig verwenden Benutzer File.open oder eine gleichwertige Methode mit Blöcken, um die Lebensdauer des Dateideskriptors zu verwalten. Beispielsweise:
In diesem Beispiel wird die Datei automatisch geschlossen.
quelle
Laut http://ruby-doc.org/core-2.1.4/File.html#method-c-open
Daher wird automatisch geschlossen, wenn der Block endet : D.
quelle
quelle
Wir können die
File.read()
Funktion verwenden, um die Datei in Ruby zu lesen ..... wie z.In diesem Beispiel
file_variable
kann der vollständige Wert dieser Datei angegeben werden.quelle