let hello1 = "Hello, world!"; let hello2 = "Hello, world!".to_string(); let hello3 = String::from("Hello, world!"); 1 Answer
let hello1 = "Hello, world!"; This creates a string slice (&str). Specifically, a &'static str, a string slice that lives for the entire duration of the program. No heap memory is allocated; the data for the string lives within the binary of the program itself.
let hello2 = "Hello, world!".to_string(); This uses the formatting machinery to format any type that implements Display, creating an owned, allocated string (String). In versions of Rust before 1.9.0 (specifically because of this commit), this is slower than directly converting using String::from. In version 1.9.0 and after, calling .to_string() on a string literal is the same speed as String::from.
let hello3 = String::from("Hello, world!"); This converts a string slice to an owned, allocated string (String) in an efficient manner.
let hello4 = "hello, world!".to_owned(); The same as String::from.
See also:
6 Comments
.into() fits into all of this, this is answered by the How to create a String directly? link in this answer.ToString, Into / From, and ToOwned traits all mean different conceptual things, it just happens that they all do the same concrete thing for strings. My personal preference is to use "string literal".into() if it works, otherwise String::from("string literal"). In other cases, I'll change a function to accept impl Into<String> so I don't have to care at all at the call site.to_string() the same as String::from() — not always, no. It should be the same when used on a string type though. formatting machinery — the part of the standard library that implements all the functionality of tools like println! or write!. The things documented by std::fmt