Im nächtlichen Rust ist es nicht mehr möglich, ein String-Literal als String zu definieren ein "~" Zeichen .
In C ++ verwende ich zum Beispiel benutzerdefinierte Literale verketten Sie String-Literale ohne die Kruste mit std::string
jedes Mal zu erwähnen:
Gibt es ein ähnliches Feature, das in Rust existiert oder geplant ist, um die String-Literalkettung weniger schmerzhaft zu machen als String::from_str ("Hello, ") + "world!"
?
Hinweis: Diese Antwort bezieht sich auf eine Version 1.0 von Rust, und die Bibliotheken haben sich seit ihrer Erstellung geändert. Insbesondere
append
ist tatsächlich verschwunden, ersetzt durch+
. Zuvor war der Operator gezwungen,&String
als Argument zu verwenden, was nun bedeutet, dass Mutation oder Allokation wiederverwendet werden, aber jetzt nimmt es den By-Value (dhString
ohne Referenzen), was bedeutet, dass er die Zuweisung wiederverwenden kann.
Wenn Sie wörtlich (hah) Zeichenfolgenliterale haben, können Sie die concat!
(Das concat!("Hello, ", "world!")
verbraucht alle folgenden Leerräume, einschließlich der führenden Leerzeichen in der nächsten Zeile; das Weglassen von \
wird die Zeichenfolgedaten "wörtlich" einschließen, mit Zeilenumbrüchen und führenden Leerzeichen usw.)
In jedem Fall ist \
mit +
in Situationen wie diesem sehr ineffizient, da String
die alte Zuweisung verwerfen und eine neue mit dem Ergebnis erstellen wird (dh sie wird den alten Speicher nicht wiederverwenden ). Wenn Sie nicht nur Literale verarbeiten und progressiv eine Zeichenfolge erstellen, können Sie String + &str
in einem Verkettungsstil hinzu append
oder "foo".to_string().append("bar").append("baz")
iterativ, lass mut s=" foo ".to_string (); s.push_str ("bar"); s.push_str ("baz");.
Sie können das Makro format!
verwenden. Es ist lesbarer, übersetzungsfreundlicher, effizienter und leistungsfähiger (Sie können mehr als nur Strings verketten, genau wie C ++ ostringstream
). Es ist auch komplett typsicher.
Sie können auch benannte Argumente verwenden, um die Lesbarkeit zu verbessern.
%Vor%Die vollständige Formatierungssyntax wird in std :: fmt beschrieben.
Rust verfügt nicht über benutzerdefinierte Literale. Ich denke, dass das Hinzufügen einer solchen Funktion rückwärtskompatibel ist, also wird diese Funktion möglicherweise nach Rust 1.0 hinzugefügt.
Tags und Links rust