Hinweis: Diese Frage enthält veralteten Code vor 1.0! Die Antwort ist jedoch richtig.
Um ein str
in ein int
in Rust umzuwandeln , kann ich Folgendes tun:
let my_int = from_str::<int>(my_str);
Der einzige Weg, wie ich a String
in ein konvertieren kann , int
besteht darin, ein Stück davon zu bekommen und es dann from_str
wie folgt zu verwenden :
let my_int = from_str::<int>(my_string.as_slice());
Gibt es eine Möglichkeit , um direkt eine umwandeln String
zu ein int
?
use std::str::FromStr;
behebt das. Mehr zu from_str, wenn Sie möchten. doc.rust-lang.org/std/str/trait.FromStr.html#tymethod.from_strAntworten:
Mit der
str::parse::<T>()
Methode können Sie direkt in ein int konvertieren .Sie können entweder den Typ angeben, auf den mit dem Turbofish-Operator (
::<>
) analysiert werden soll, wie oben gezeigt, oder über eine explizite Typanmerkung :Wie in den Kommentaren erwähnt, wird
parse()
a zurückgegebenResult
. Dieses Ergebnis ist ein Ergebnis,Err
wenn die Zeichenfolge nicht als der angegebene Typ analysiert werden konnte (z. B. kann die Zeichenfolge"peter"
nicht als analysiert werdeni32
).quelle
parse
a zurückgegebenResult
wird. Sie müssen also entsprechend damit umgehen, um zu einem tatsächlichen Integraltyp zu gelangen.str::parse::<u32>
gibt einResult<u32, core::num::ParseIntError>
und zurückResult::unwrap
"Packt ein Ergebnis aus und liefert den Inhalt einerOk
[oder] Panik, wenn der Wert ein istErr
, mit einer Panikmeldung, die vomErr
Wert des ' bereitgestellt wird ."str::parse
ist eine generische Funktion , daher der Typ in spitzen Klammern.quelle
let my_u8: u8
) angeben , benötigen Sie den Wert nicht in spitzen Klammern. Beachten Sie auch, dass der vorherrschende Roststil anzeigt, dass er:
auf der linken Seite bleiben sollte.let my_u32: u32 = "42".parse().unwrap()
Wenn Sie Ihre Saite erhalten
stdin().read_line
, müssen Sie sie zuerst kürzen.quelle
Mit einem letzten Abend können Sie dies tun:
Was hier passiert ist, dass
String
jetzt in eine dereferenziert werden kannstr
. Die Funktion will jedoch eine&str
, also müssen wir uns wieder ausleihen. Als Referenz glaube ich, dass dieses spezielle Muster (&*
) als "Cross-Borrowing" bezeichnet wird.quelle
String
an einem Punkt zu dereferenzieren und hoffte, dass es funktionieren würde.my_sttring.as_slice()
als ausdrückenmy_string[]
(derzeitslicing_syntax
ist es funktionsgesteuert, aber höchstwahrscheinlich würde eine Form davon in der Sprache enden).Sie können die Methode des
FromStr
Merkmalsfrom_str
verwenden, die implementiert ist füri32
:quelle
Nun, nein. Warum sollte es geben? Verwerfen Sie die Zeichenfolge einfach, wenn Sie sie nicht mehr benötigen.
&str
ist nützlicher alsString
wenn Sie nur eine Zeichenfolge lesen müssen, da es sich nur um eine Ansicht der ursprünglichen Daten handelt, nicht um deren Eigentümer. Sie können es einfacher weitergeben alsString
und es ist kopierbar, sodass es nicht von den aufgerufenen Methoden verwendet wird. In dieser Hinsicht ist es allgemeiner: Wenn Sie ein habenString
, können Sie es an die Stelle übergeben, an der ein&str
erwartet wird. Wenn Sie dies haben&str
, können Sie es nur an Funktionen übergeben, die erwarten,String
dass Sie eine neue Zuordnung vornehmen.Weitere Informationen zu den Unterschieden zwischen diesen beiden und deren Verwendung finden Sie im offiziellen String-Handbuch .
quelle
.as_slice()
jedes Mal tun müsste, wenn ichfrom_str
an einem String arbeiten muss. Befehlszeilenargumente zum Beispiel sind eine Stelle, an der ichfrom_str
alle Argumenteint
as_slice()
ist nur ein kleiner Aspekt der Handhabung von Zeichenfolgen. Sie können beispielsweise die Slicing-Syntax (s[]
) verwenden oderDeref
Zwang (&*s
) ausnutzen . Es gibt sogar einen Vorschlag, der es erlauben würde, nur zu schreiben&s
.&s
für eine Saite tun? Würde es etwasstr
zurückgeben? Könnten Sie mich auf den Vorschlag hinweisen?str
ist es nicht das, womit Sie arbeiten; es ist&str
. Sie sind unterschiedlich (aber verwandt). Ersteres ist ein Typ mit dynamischer Größe, den Sie fast nie direkt verwenden würden, während letzteres ein String-Slice ist, das ein fetter Zeiger ist. Der Vorschlag heißt Deref-Zwang ; es erlauben würde , von zu zwingen ,&T
zu&U
wennT: Deref<U>
. DaString: Deref<str>
bereits, Sie erhalten können&str
ausString
mit nur&
. Es wird noch diskutiert, aber ich bezweifle, dass es vor 1.0 passieren wird - es bleibt zu wenig Zeit.Im Grunde möchten Sie also einen String in eine Ganzzahl umwandeln, richtig! Hier ist, was ich meistens benutze und das wird auch in der offiziellen Dokumentation erwähnt.
Dies funktioniert sowohl für String als auch für & str. Ich hoffe, dies wird auch helfen.
quelle