Suche…


Einführung

Im Gegensatz zu vielen anderen Sprachen, hat Rust zwei String - Typen: String (a heap-zugewiesenen String - Typen) und &str (a entlehnt String, der keine zusätzlichen Speicher nicht verwendet). Um zu verstehen, wie Rust funktioniert, ist es wichtig, den Unterschied zu kennen und zu wissen, wann er verwendet wird.

Grundlegende String-Manipulation

fn main() {
    // Statically allocated string slice
    let hello = "Hello world";

    // This is equivalent to the previous one
    let hello_again: &'static str = "Hello world";

    // An empty String
    let mut string = String::new();

    // An empty String with a pre-allocated initial buffer
    let mut capacity = String::with_capacity(10);

    // Add a string slice to a String
    string.push_str("foo");

    // From a string slice to a String
    // Note: Prior to Rust 1.9.0 the to_owned method was faster
    // than to_string. Nowadays, they are equivalent.      
    let bar = "foo".to_owned();
    let qux = "foo".to_string();

    // The String::from method is another way to convert a
    // string slice to an owned String.
    let baz = String::from("foo");

    // Coerce a String into &str with &
    let baz: &str = &bar;
}

Anmerkung: Sowohl die Methode String::new als auch die String::with_capacity erstellen leere Zeichenfolgen. Letzterer weist jedoch einen Anfangspuffer zu, wodurch dieser anfänglich langsamer wird, jedoch nachfolgende Zuweisungen reduziert werden. Wenn die endgültige Größe des String::with_capacity bekannt ist, sollte String::with_capacity bevorzugt werden.

Schnur schneiden

fn main() {
    let english = "Hello, World!";

    println!("{}", &english[0..5]); // Prints "Hello"
    println!("{}", &english[7..]);  // Prints "World!"
}

Beachten Sie, dass wir hier den Operator & . Es nimmt eine Referenz und gibt dem Compiler Informationen über die Größe des Slice-Typs, den er zum Drucken benötigt. Ohne die Referenz werden die beiden println! Aufrufe wären ein Fehler bei der Kompilierung.

Warnung: Das Slicing funktioniert nach Byte-Offset und nicht nach Zeichen-Offset. Wenn Grenzen nicht an einer Zeichengrenze liegen, werden Panik angezeigt

fn main() {
    let icelandic = "Halló, heimur!"; // note that “ó” is two-byte long in UTF-8

    println!("{}", &icelandic[0..6]); // Prints "Halló", “ó” lies on two bytes 5 and 6
    println!("{}", &icelandic[8..]);  // Prints "heimur!", the “h” is the 8th byte, but the 7th char
    println!("{}", &icelandic[0..5]); // Panics!
}

Dies ist auch der Grund, warum Strings keine einfache Indizierung unterstützen (zB icelandic[5] ).

Einen String teilen

let strings = "bananas,apples,pear".split(",");

split gibt einen Iterator zurück.

for s in strings {
  println!("{}", s)
}

Und kann mit der Methode Iterator::collect in einem Vec "gesammelt" werden.

let strings: Vec<&str> = "bananas,apples,pear".split(",").collect(); // ["bananas", "apples", "pear"]

Vom geliehenen zum besessenen

// all variables `s` have the type `String`
let s = "hi".to_string();  // Generic way to convert into `String`. This works
                           // for all types that implement `Display`.

let s = "hi".to_owned();   // Clearly states the intend of obtaining an owned object

let s: String = "hi".into();       // Generic conversion, type annotation required
let s: String = From::from("hi");  // in both cases!

let s = String::from("hi");  // Calling the `from` impl explicitly -- the `From` 
                             // trait has to be in scope!

let s = format!("hi");       // Using the formatting functionality (this has some
                             // overhead)

Abgesehen von format!() Sind alle oben genannten Methoden gleich schnell.

Brechen von langen String-Literalen

Brechen Sie normale String-Literale mit dem Zeichen \

let a = "foobar";
let b = "foo\
         bar";

// `a` and `b` are equal.
assert_eq!(a,b);

Brechen Sie Roh-String-Literale, um Strings zu trennen, und verbinden Sie sie mit dem concat! Makro

let c = r"foo\bar";
let d = concat!(r"foo\", r"bar");

// `c` and `d` are equal.
assert_eq!(c, d);


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow