fn make_static_str<T>(s: T) -> &'static str where T: Into<String>

fn make_static_str<T>(s: T) -> &'static str where T: Into<String>

Die Überschrift ist zu kryptisch? Die Macht der Jedi sei mit dir! ;-) Es ist eine Rust Funktions-Definition.

Damit können beliebige Strings in statischen Heap-Speicher gelegt werden und man bekommt eine Referenz darauf zurück. Allerdings muss man sich jetzt selber um's dropen des Speichers kümmern und das muss man richtig machen.

Die Funktion dazu sieht so aus:

pub fn make_static_str<T>(s: T) -> &'static str
where
    T: Into<String>,
{
    Box::leak(s.into().into_boxed_str())
}

#[test]
fn test() {
    let x: &'static str = make_static_str("hello");
    assert_eq!(x, "hello");
    let x: &'static str = make_static_str("HELLO".to_string());
    assert_eq!(x, "HELLO");
}

Rust Playground

Aber Achtung ...

Wie der Befehl Box::leak im Prinzip schon aussagt, wird hier bei unüberlegter Anwendung ein Speicher-Leak produziert. Also unbedingt die Erklärung der Dokumentation lesen!

Um ehrlich zu sein, kann man das nur selten brauchen. Ich bin darauf gestoßen, als ich Nur-Lesenden-Speicher von unterschiedlichen Threads lesen wollte. Hier bietet sich aber Arc an um die Typ- und Speicher-Prüfung der Rust-Compilers nicht auszuhebeln.
Zugegeben, das macht es etwas umständlicher, wie ich finde, aber eben auch sicherer. Dafür ist Rust nun mal da. In einem der nächsten Artikel stelle ich einige der First-Gotchas beim Einstieg in Rust vor.