В моем примере я беру переменную среды и передаю ее в заголовок 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
?
Еще лучше было бы format!(...).try_into()
, чтобы избежать создания нового распределения без причины.
HeaderValue
реализует TryFrom<String>
, поэтому вы можете преобразовать его с помощью try_into
.
headers.insert(
AUTHORIZATION,
format!("Bearer {}", token).try_into().expect("invalid characters"),
);
Вы можете сделать его статическим, например, с помощью OnceLock, но в этом нет необходимости, если только вы не создаете это HeaderMap
несколько раз.
Использование from_str()
сработало, спасибо!
@joedborg from_str()
создаст копию строки в новом выделении только для того, чтобы строка, созданная вами с помощью format!
, была немедленно уничтожена. .try_into()
— это правильный способ сделать это, поскольку он просто перейдет во владение распределением без какого-либо копирования.
Если вы не в курсе,
from_static
— не единственный конструктор. Вы можете использоватьfrom_str
, если ваша строка не является константой.