Я только что написал это, что на языке низкого уровня кажется уродливым:
match std::env::var("IN_DEPLOYMENT")
.unwrap_or("false".to_string())
.as_str()
{
"false" | "FALSE" | "0" => {
tracing_subscriber::fmt().init();
}
_ => tracing_subscriber::fmt().json().init(),
}
Как мне избежать необходимости использования временной строки? Моей первой мыслью было сопоставить непосредственно результат, но я не мог понять, как преобразовать Result<String,_>
в Result<&str, _>
.
Сначала вам следует преобразовать Result<String, E>
в Result<&str, &E>
. Это можно сделать с помощью метода Result::as_deref:
fn foo() {
match std::env::var("IN_DEPLOYMENT").as_deref().unwrap_or("false") {
"false" | "FALSE" | "0" => todo!(),
_ => todo!(),
}
}
С другой стороны, если вам действительно нужен собственный String
, отдайте предпочтение Result::unwrap_or_else вместо Result::unwrap_or
(тот же аргумент применим и к Option
), потому что это предотвратит выделение, когда есть данные для развертывания. Есть ворс, который проверяет это.
Вот и все! Спасибо. Я попробовал .as_ref
, но все время забываю, что преобразование выполняет разыменование. Спасибо и за подсказку.
@2e0byo as_deref()
то же самое, что as_ref().map(Deref::deref)
. Так что вы можете использовать as_ref
, это короче.
ох, это *&
, не так ли. Я давно не пишу ржавчину и не претендую на какую-либо компетентность.
@Unlikus, вы не можете использовать
Result::map
, потому что он будет использовать оригинальныйResult
, содержащийString
. Поэтому вы не можете вернуть ссылку на него.Result::as_deref
хотя могу это сделать.