Gibt es eine Möglichkeit für die Rückgabe einer Referenz auf eine variable in einer Funktion?
Ich möchte ein Programm schreiben, das schreiben einer Datei in 2 Schritten.
Es ist wahrscheinlich, dass die Datei möglicherweise nicht vorhanden sein, bevor das Programm ausgeführt wird. Das mit dem Namen ist behoben.
Das problem ist, dass OpenOptions.new().write()
scheitern kann. In diesem Fall möchte ich eine benutzerdefinierte Funktion aufzurufen trycreate()
. Die Idee ist, erstellen Sie die Datei, anstatt es zu öffnen und ein handle zurück. Da das mit dem Namen ist behoben, trycreate()
keine Argumente hat und ich kann nicht einstellen, ein Leben lang von den zurückgegebenen Wert.
Wie kann ich dieses problem beheben?
use std::io::Write;
use std::fs::OpenOptions;
use std::path::Path;
fn trycreate() -> &OpenOptions {
let f = OpenOptions::new().write(true).open("foo.txt");
let mut f = match f {
Ok(file) => file,
Err(_) => panic!("ERR"),
};
f
}
fn main() {
{
let f = OpenOptions::new().write(true).open(b"foo.txt");
let mut f = match f {
Ok(file) => file,
Err(_) => trycreate("foo.txt"),
};
let buf = b"test1\n";
let _ret = f.write(buf).unwrap();
}
println!("50%");
{
let f = OpenOptions::new().append(true).open("foo.txt");
let mut f = match f {
Ok(file) => file,
Err(_) => panic!("append"),
};
let buf = b"test2\n";
let _ret = f.write(buf).unwrap();
}
println!("Ok");
}
InformationsquelleAutor Nex | 2015-09-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
fjh ist absolut richtig, aber ich möchte, zu kommentieren, ein bisschen tiefer und berühren einige der anderen Fehler mit dem code.
Beginnen wir mit einem kleineren Beispiel der Rückgabe einer Referenz-und der Blick auf die Fehler:
Rust 2015
Rost 2018
Technisch "ja", aber für das, was Sie wollen, "Nein".
Einen Verweis auf einen vorhandenen Speicherbereich. In einer Funktion ohne Argumente, die nur Dinge, die verwiesen werden, sind Globale Konstanten (die haben die Lebensdauer
&'static
) und lokalen Variablen. Ich werde ignorieren globals für jetzt.In einer Sprache wie C oder C++, könnte man tatsächlich eine Referenz auf eine lokale variable, und gibt es zurück. Jedoch, sobald die Funktion zurückkehrt, gibt es keine Garantie, dass der Speicher, auf die Sie verweisen weiterhin auf das sein, was Sie dachte, es war. Es könnte bleiben, was Sie erwarten, für eine Weile, aber irgendwann ist der Speicher erhalten wiederverwendet werden für etwas anderes. Sobald der code sieht bei der Erinnerung und versucht, Sie zu interpretieren, ein Benutzername, wie die Menge an Geld mehr in der bank-Konto des Benutzers, Probleme entstehen!
Dies ist, was Rost Leben verhindern - Sie sind nicht erlaubt, verwenden Sie eine Referenz über, wie lange die genannten-Wert an der aktuellen Position im Speicher.
Anstatt zu versuchen, um wieder eine Referenz geben ein Objekt, dessen Besitzer.
String
statt&str
,Vec<T>
statt&[T]
,T
statt&T
usw.Siehe auch:
Deinem eigentlichen problem
Schauen Sie in die Dokumentation für
OpenOptions::open
:Gibt es eine
Result<File>
, also ich weiß nicht, wie man erwarten würde, um eineOpenOptions
oder eine Referenz auf ein. Ihre Funktion würde funktionieren, wenn Sie umschrieb es so:Diese verwendet
Ergebnis::erwarten
in Panik zu geraten mit einer nützlichen Fehlermeldung. Natürlich, in Panik in den Eingeweiden des Programms ist nicht super nützlich, so ist es empfehlenswert, Sie zu verbreiten, Ihre Fehler wieder aus:Option
undResult
haben viele schöne Methoden im Umgang mit verketteten Fehler Logik. Hier können Sieor_else
:Ich würde Sie auch zurück in die
Result
ausmain
. Alle zusammen, einschließlich der fjh Vorschläge:nur eine Warnung... wie unsicher 🙂 Obwohl es zeigt, dass es schon ein paar Jahre her, seit ich schrieb C für einen Tag Arbeit, weil ich nie zu sehen bekam jeder von diesen Warnungen. Schön zu sehen, Fortschritte in allen lagern!
Sie müssen schon mit einem alten compiler; ich bin immer noch sitzt auf gcc-4.3.2, und ich habe es! Aber ja, nur eine Warnung. Die meisten C/C++ - Compiler nehmen Sie einen konservativen Ansatz: Fehler sind beauftragt von der Norm, und den rest erledigt die mit Warnungen (mit mehr oder weniger Genauigkeit ...)
Wir hatten schon eine ältere compiler, aber vielleicht nicht so alt. Es ist möglich, dass ich nie versuchte, eine lokale variable als Referenz, natürlich, aber ich weiß nicht, ich könnte behaupten, dass eine gute. 🙂
es wird keine Methode namens
Write
. Sie sind auf der Suche fürwrite
, und Sie müssen die Eigenschaft in-scope. Überprüfen Sie heraus die Rust 1.0 / "eine Datei schreiben" - Abschnitt der Was ist der de-facto-Weise Lesen und schreiben von Dateien in Rust 1.x?.InformationsquelleAutor Shepmaster
Nicht (außer Verweise auf die statischen Werte, aber die sind nicht hier hilfreich).
Jedoch, möchten Sie vielleicht zu schauen,
OpenOptions::create
. Wenn Sie Ihre erste Zeile inmain
zuwird die Datei erstellt, falls es noch nicht existiert, das sollte bei der Lösung Ihrer ursprünglichen problem.
InformationsquelleAutor fjh