Eine bequemere Verkettung mit einem String-Literal in Rust

7

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:

%Vor%

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!" ?

    
ArtemGr 15.08.2014, 14:30
quelle

2 Antworten

13
  

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 (dh String ohne Referenzen), was bedeutet, dass er die Zuweisung wiederverwenden kann.

Wenn Sie wörtlich (hah) Zeichenfolgenliterale haben, können Sie die concat! Makro, z %Code%. Sie können Zeichenfolgen auch nativ über mehrere Zeilen teilen, z. B.

%Vor%

(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");.

    
huon 16.08.2014 07:06
quelle
11

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.

%Vor%

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.

    
barjak 15.08.2014 17:40
quelle

Tags und Links