Я только что написал это, что на языке низкого уровня кажется уродливым:
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хотя могу это сделать.