Rückkehr lokalen Zeichenfolge als eine Scheibe (&str)
Gibt es einige Fragen, die zu sein scheinen etwa das gleiche problem das ich habe. Siehe zum Beispiel hier und hier. Grundsätzlich bin ich versucht zu bauen String
in einer lokalen Funktion, aber dann wieder es als &str
. Schneiden funktioniert nicht, denn die Lebenszeit ist zu kurz. Ich kann nicht mit str
direkt in die Funktion, weil ich Sie brauche um es zu bauen dynamisch. Allerdings würde ich auch bevorzugen, nicht zurückzukehren, eine String
da die Art des Objektes dies wird in statisch ist, sobald es gebaut wird. Gibt es eine Möglichkeit zu haben, meine Kuchen und Essen es auch?
Hier ist eine minimale nicht-kompilieren Reproduktion:
fn return_str<'a>() -> &'a str {
let mut string = "".to_string();
for i in 0..10 {
string.push_str("ACTG");
}
&string[..]
}
Andere Fragen, die haben das gleiche problem, und die Antwort ist immer noch die gleiche: es ist nicht möglich, erstellen Sie eine
Ihre Argumentation für die nicht wollen, um wieder eine
Sie eigentlich schon etwas anderes, ich wurde gefragt, ob mit
Manche finden diesen Artikel hilfreich: Strategien für die Rückgabe von Referenzen in Rost.
String
in eine Funktion und schicken Sie es als ein &str
wegen Rost-Speicher-Modell.Ihre Argumentation für die nicht wollen, um wieder eine
String
macht für mich keinen Sinn. Speichern nur eine String
in dieser "statische" Objekt, das anstelle eines &str
. Es ist einfacher, es ist mindestens so ergonomisch ist, macht es mehr Sinn, Besitz-Weise, und es ist nicht einmal jeder performance-Vorteil.Sie eigentlich schon etwas anderes, ich wurde gefragt, ob mit
String
hat irgendwelche performance-Nachteile. Ich sollte in der Lage umgestalten zu verwenden String
sManche finden diesen Artikel hilfreich: Strategien für die Rückgabe von Referenzen in Rost.
InformationsquelleAutor anderspitman | 2015-04-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, das können Sie nicht. Es gibt zumindest zwei Erklärungen, warum es so ist.
Ersten, denken Sie daran, dass Referenzen entlehnt sind, d.h. Sie zeigen einige Daten, aber nicht es selbst, es ist im Besitz von jemand anderem. In diesem speziellen Fall ist der string, eine Scheibe, auf die Sie zurückkehren möchten, ist besessen von der Funktion, denn es ist gespeichert in einer lokalen variable.
Wenn die Funktion beendet wird, werden alle zugehörigen lokalen Variablen werden zerstört; diese beinhaltet den Aufruf von Destruktoren, und der Destruktor
String
befreit den Arbeitsspeicher, der von der saite. Sie möchten jedoch die Rückgabe eines geliehenen Verweis auf die zugeteilten Daten für die Zeichenfolge. Es bedeutet, dass die zurückgegebene Referenz wird sofort baumelt - es weist auf ungültigen Speicher!Rost erstellt wurde, unter den alles andere, um solche Probleme zu vermeiden. Also, in Rust, ist es unmöglich für die Rückgabe einer Referenz zeigt in lokale Variablen der Funktion, die möglich ist, in Sprachen wie C.
Gibt es auch eine andere Erklärung, die etwas mehr formal. Schauen wir uns die Funktion Signatur:
Denken Sie daran, dass Leben und generische Parameter sind Parameter: Sie werden durch den Aufrufer der Funktion zurückgegeben. Zum Beispiel, eine andere Funktion, kann es so nennen:
Dies erfordert
'a
zu'static
, aber es ist natürlich unmöglich, - Ihre Funktion nicht wieder einen Verweis auf einen statischen Speicher, gibt es eine Referenz mit streng geringere Lebensdauer. Also solche Funktion definition ist ungesund und verboten ist, durch den compiler.Jedenfalls, in solchen Situationen müssen Sie einen Wert zurückzugeben, der eine eigene Art, in diesem speziellen Fall wird es eine eigene
String
:String
als'static
so lange, wie Sie Leck dieString
. (Mitstd::mem::forget
), Aber es wird weiterhin zugeteilt bleibt für immer. (Ich denke mal, dass das der Punkt in'static
)InformationsquelleAutor Vladimir Matveev
In bestimmten Fällen, Sie übergeben einen string-slice und kann bedingt möchten, erstellen Sie eine neue Zeichenfolge. In diesen Fällen können Sie sich wieder ein
Kuh
. Dies erlaubt es, die Referenz (wenn möglich) und eine eigeneString
ansonsten:InformationsquelleAutor Shepmaster
Können Sie wählen, um Speicherverlust konvertieren
String
zu einem&'static str
:Dies ist ein wirklich schlechte Idee in vielen Fällen als die Speicherauslastung wird wachsen, für immer jedes mal, wenn diese Funktion aufgerufen wird.
Wenn Sie wollte, um wieder die gleiche Zeichenfolge bei jedem Anruf, siehe auch:
InformationsquelleAutor Shepmaster