Сделать строку «постоянной» в Rust

В моем примере я беру переменную среды и передаю ее в заголовок Reqwest:

let token: String = String::from(
        env::var("TOKEN").expect("TOKEN must be set!"),
    );

let mut headers: HeaderMap = HeaderMap::new();
        headers.insert(
            AUTHORIZATION,
            HeaderValue::from_static(&format!("Bearer {}", token)),
        );

Я не думаю, что мне вообще нужен String::from, но я надеялся, что это позволит скопировать строку, а не заимствовать ее у env::var.

Компилятор возвращает эту ошибку:

временная стоимость упала во время займа
создает временное значение, которое освобождается, пока оно еще используется

for &format!("Bearer {}", token), что, насколько я понимаю, связано с тем, что строка должна быть статичной. Есть ли способ сделать это лучше, не используя такую ​​библиотеку, как lazy_static?

Если вы не в курсе, from_static — не единственный конструктор. Вы можете использовать from_str, если ваша строка не является константой.

Ivan C 01.07.2024 19:23

Еще лучше было бы format!(...).try_into(), чтобы избежать создания нового распределения без причины.

cdhowie 01.07.2024 20:13
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
2
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

HeaderValue реализует TryFrom<String>, поэтому вы можете преобразовать его с помощью try_into.

headers.insert(
    AUTHORIZATION,
    format!("Bearer {}", token).try_into().expect("invalid characters"),
);

Вы можете сделать его статическим, например, с помощью OnceLock, но в этом нет необходимости, если только вы не создаете это HeaderMap несколько раз.

Использование from_str() сработало, спасибо!

joedborg 01.07.2024 20:21

@joedborg from_str() создаст копию строки в новом выделении только для того, чтобы строка, созданная вами с помощью format!, была немедленно уничтожена. .try_into() — это правильный способ сделать это, поскольку он просто перейдет во владение распределением без какого-либо копирования.

cdhowie 01.07.2024 20:24

Другие вопросы по теме