Есть хорошая статья:
https://habr.com/ru/post/274485/
У строковых литералов тип
&'static str
. Тоесть это заимствованная ссылка на объект с неограниченным временем жизни.
А to_string возвращает уже owned строку типа
std::string::String
А нужно это в данном коде, чтобы показать механику владения, что очевидно нельзя, если никто не является владельцем значений, как в случае со ссылками.
Если ты хочешь получить именно String из строкового литерала, то есть сразу несколько вариантов, включая показанный:
let a: String = String::from("a");
let b: String = "b".to_string();
let c: String = "c".into(); // или "c".into::<String>(), если не указывать тип явно.
let d: String = "d".to_owned();